我需要以最大可能的精度来衡量我的代码的性能。
目前我正在使用:
- 秒表测量时间
- 设置进程关联以始终使用相同的CPU核心
- 将线程优先级设置为最大值
- 在测量之前执行预热运行
- 运行测试1000次并计算平均值
但是,我仍然在基准测试运行之间存在差异(最大约1%)。任何想法如何使这种测量更精确?
答案 0 :(得分:2)
这可能很明显,但您的CPU并不专注于您的单个进程。它还负责操作系统和硬件的许多其他事情。
此外,内存使用情况,HDD使用情况和GC的行为可能因执行而异。也许你的计算需要虚拟内存,这比RAM访问要慢得多。等等...
关于GC,您可以尝试使用" GCSettings.LatencyMode"的不同设置。查看它是否有任何改变(例如,参见http://blogs.microsoft.co.il/blogs/sasha/archive/2008/08/10/low-latency-gc-in-net-3-5.aspx)。
在同一台计算机上的单个会话中,秒表非常准确:如果执行期间的持续时间不同,可能不是因为测量精度不高,而是因为过程本身没有#&# 39;总是在同一时间...... 显然,每次"迭代"你的测试应该至少花费几百毫秒,秒表永远无法测量持续时间,以纳秒为单位......
1%的变化并不令人惊讶。
答案 1 :(得分:0)
是否存在性能差异的原因,例如外部组件?
1%的变化在性能上超过1000次运行,特别是如果它依赖于任何外部因素,例如连接到数据库或服务。
秒表是测量时间的最准确方法,因此我不会关注
答案 2 :(得分:0)
在开始测量之前运行预热代码至少10秒钟。必须确保CPU以最大速度运行。
测量最低运行时间,而不是平均值。
通过这两项改进,我获得了非常稳定的测量结果。