为了账号安全,请及时绑定邮箱和手机立即绑定

在C#中对小型代码样本进行基准测试,是否可以改善此实现?

在C#中对小型代码样本进行基准测试,是否可以改善此实现?

慕斯709654 2019-10-14 10:33:24
经常在SO上我发现自己对一小段代码进行基准测试,以了解哪种实现速度最快。我经常看到这样的评论,即基准测试代码未考虑到jitting或垃圾收集器。我具有以下逐渐发展的简单基准测试功能:  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在Z迭代上比实现Y快?您能想到任何改善此方法的方法吗?编辑 显然,基于时间的方法(而不是迭代)是首选,有人在时间检查不会影响性能的情况下实现吗?
查看完整描述

3 回答

?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

最终确定不一定要在GC.Collect返回之前完成。将完成排队,然后在单独的线程上运行。测试期间该线程可能仍处于活动状态,从而影响结果。


如果要确保在开始测试之前完成完成工作,则可能要调用GC.WaitForPendingFinalizers,它将阻塞直到清除完成工作队列为止:


GC.Collect();

GC.WaitForPendingFinalizers();

GC.Collect();


查看完整回答
反对 回复 2019-10-14
  • 3 回答
  • 0 关注
  • 633 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信