[解決済み] C#の小さなコードサンプルのベンチマーク、この実装は改善できるのか?
2022-10-29 12:56:27
質問
SOではしばしば、どの実装が最も速いかを見るために、コードの小さな塊をベンチマークしている自分に気づきます。
ベンチマークコードはジッターやガベージコレクタを考慮していないというコメントをよく見かけます。
私は以下のような簡単なベンチマーク関数を持っており、少しずつ進化させています。
static void Profile(string description, int iterations, Action func) {
// warm up
func();
// clean up
GC.Collect();
var watch = new Stopwatch();
watch.Start();
for (int i = 0; i < iterations; i++) {
func();
}
watch.Stop();
Console.Write(description);
Console.WriteLine(" Time Elapsed {0} ms", watch.ElapsedMilliseconds);
}
使用方法
Profile("a descriptions", how_many_iterations_to_run, () =>
{
// ... code being profiled
});
この実装には何か欠陥がありますか?実装Xは実装YよりもZ回の繰り返しで高速であることを示すのに十分でしょうか?これを改善する方法を思いつきますか?
EDIT 時間ベースのアプローチ(反復ではなく)が好ましいことは明らかですが、時間チェックがパフォーマンスに影響を与えないような実装をお持ちの方はいらっしゃいますか?
どのように解決するのですか?
コミュニティによって推奨されるように、この機能を修正するのは自由です。
static double Profile(string description, int iterations, Action func) {
//Run at highest priority to minimize fluctuations caused by other processes/threads
Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.High;
Thread.CurrentThread.Priority = ThreadPriority.Highest;
// warm up
func();
var watch = new Stopwatch();
// clean up
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
watch.Start();
for (int i = 0; i < iterations; i++) {
func();
}
watch.Stop();
Console.Write(description);
Console.WriteLine(" Time Elapsed {0} ms", watch.Elapsed.TotalMilliseconds);
return watch.Elapsed.TotalMilliseconds;
}
必ず 最適化を有効にして Release でコンパイルし、Visual Studio の外部でテストを実行します。 . この最後の部分は重要です。なぜなら、JITはReleaseモードであっても、デバッガが接続されていると最適化を抑制するからです。
関連
-
[解決済み】指定されたキャストが有効でない?
-
[解決済み] 保護レベルによりアクセス不能になりました。
-
[解決済み】C#はJavaのcharAt()と同等?)
-
[解決済み] DBNullから他の型にオブジェクトをキャストすることができない
-
[解決済み】WPFでXamlファイルにコメントを追加する方法は?
-
[解決済み】aspNetCore 2.2.0 - AspNetCoreModuleV2 エラー
-
[解決済み] Linux上で動作するC++コードのプロファイリングを行うにはどうすればよいですか?
-
[解決済み] C#でこの辞書のキーが存在するかどうかを検出するにはどうすればよいですか?
-
[解決済み】C#の符号付き浮動小数点のこの奇妙な動作を説明できる人はいますか?
-
[解決済み] C#のコードからEXEファイルを実行するにはどうしたらいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】WebForms UnobtrusiveValidationModeは、jqueryのScriptResourceMappingを必要とする
-
[解決済み] 保護レベルによりアクセス不能になりました。
-
[解決済み】Excel "外部テーブルが期待された形式ではありません。"
-
[解決済み】「入力文字列が正しい形式ではありませんでした」エラーの解決方法は?[重複しています]。
-
[解決済み】リソースの読み込みに失敗した:ステータス500(内部サーバーエラー)のサーバーの応答)
-
[解決済み】値が期待した範囲に収まらない
-
[解決済み】MetadataException: 指定されたメタデータ・リソースをロードできない
-
[解決済み】ランダムなブーリアンを生成する最速の方法
-
[解決済み】Microsoft.Extensions.LoggingからILoggerを解決することができない
-
[解決済み】パフォーマンステストの正確な時間測定【重複あり