|
推測するな計測しろ! の鉄則に則って調査してみました
//https://learn.microsoft.com/en-us/windows/win32/api/profileapi/nf-profileapi-queryperformancecounter
loaddll @"QueryPerformanceCounter.DLL"; // 自作DLL
#beginTick = dllfunc("QueryPerformanceCounter"); // 1マイクロ秒精度のタイマ値を取得
execmacro $macropath; // マクロを呼ぶ (マクロの内容は コメント分 + 最後に endmacro;)
#endTick = dllfunc("QueryPerformanceCounter"); // #endTick - #beginTick の値が経過時間 (間に何もなければ 7マイクロ秒くらい)
// Ryzen 3600X (3.8GHz) 環境にて 秀丸エディタ32bit版 v9.35b6 でベンチマーク
// 実際の検証は、Windowsのファイルアクセス状態や他の要因の排除、複数回の実行を平均化するなどして統計データとした
・毎回ファイルが読み込まれ、毎回コードが解析されている
1回の実行は 0.3 ミリ秒になる (コメントなし endmacro; のみ)
・コメント文を読み飛ばす早さは 1MB の時に 14ミリ秒 *余分に*かかった (1,047,576バイトのコメント + endmacro;)
・コメント部分が 512KB の時は 7.2ミリ秒
・コメント部分が 128KB の時は 2.1ミリ秒
・コメント部分が 32KB の時は 0.5ミリ秒
・コメントの量にほぼ比例
・/* ブロックコメント */ と // 行コメント に差はない
・xxx.mac.cache という拡張子であれば、キャッシュがあればコード解析は行われない
1回の実行が 0.4 ミリ秒になる (コメントが省かれた小さな .cache ファイルになっている)
マニュアルにある通り、小さいマクロの場合は .mac.cache の方が 0.1 ミリ秒程度くらい時間がかかる
損益分岐点(キャッシュ使わず直接実行した方が早いマクロサイズ)は 2.5KB だった
コードが100行を超えるようなマクロはキャッシュの仕組みを使った方が良さそう
・128KB (131,072バイト) のコード解析時間 (冒頭の endmacro; で終わる雑多なマクロをコメント除去して連結したファイル)
コメント無し最小ファイルと比べて 2.7ms の追加の解析時間が発生 (同じサイズの全てコメントのマクロの場合から 0.6ミリ秒の増加)
マクロ指定を xxx.mac.cache とした場合 76KB の解析済みファイルが作成され、キャッシュを使う場合のマクロの実行時間は 0.4 ミリ秒
> Haswellでも体感できるレベルにもなり得ますか?
1メガバイトのコメントが余分に含まれているマクロをキャッシュを使わずに実行した場合、
画面のリフレッシュレートを 60fps とするのであれば1フレーム(16.6ms)の描画の遅延が起こり得て、
それを認識できるゲーマーであれば気付けるかもしれないレベルというテスト結果となりました
※積極的にマクロのキャッシュ機能を使いましょう。それだけで杞憂は解消します
|
|