經(jīng)常在SO上我發(fā)現(xiàn)自己對一小段代碼進行基準測試,以了解哪種實現(xiàn)速度最快。我經(jīng)??吹竭@樣的評論,即基準測試代碼未考慮到j(luò)itting或垃圾收集器。我具有以下逐漸發(fā)展的簡單基準測試功能: 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});此實現(xiàn)有任何缺陷嗎?是否足以證明實現(xiàn)X在Z迭代上比實現(xiàn)Y快?您能想到任何改善此方法的方法嗎?編輯 顯然,基于時間的方法(而不是迭代)是首選,有人在時間檢查不會影響性能的情況下實現(xiàn)嗎?
3 回答

梵蒂岡之花
TA貢獻1900條經(jīng)驗 獲得超5個贊
最終確定不一定要在GC.Collect返回之前完成。將完成排隊,然后在單獨的線程上運行。測試期間該線程可能仍處于活動狀態(tài),從而影響結(jié)果。
如果要確保在開始測試之前完成完成工作,則可能要調(diào)用GC.WaitForPendingFinalizers,它將阻塞直到清除完成工作隊列為止:
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
- 3 回答
- 0 關(guān)注
- 724 瀏覽
添加回答
舉報
0/150
提交
取消