介绍
每个使用System.Diagnostics命名空间下的Stopwatch类做性能优化的人迟早会遇到一些麻烦。每个人都可以看到了,在同一台电脑相同功能的测试在运行时间上会有25% -30%不同。本文介绍如何使用Stopwatch类设计单线程测试程序获得0.1% - 0.2%准确性。有了这个精度,算法才可以进行测试和比较。
背景
现代CPU有多个内核,大容量高速缓存,指令管道和许多其他的东西影响特定测试场景一个算法的运行 时间。白盒测试技术-如附加的调试器或者分析器-关闭 CPU的高速缓存线路,管道等。真正的运行时间是 隐藏的,这样这些现代超标量处理器优化的计算方法执行速度要比使用分析器的没有优化的还要慢(由于 更多的指令)。黑盒测试没有附加的调试器或分析器(运行时间测量),能发现算法的实际性能,并完成 了算法的性能分析。
设置测试方案
最重要的是防止CPU内核或处理器之间的切换。对性能测试有很大的影响。这可以通过设置进程的 ProcessorAffinity来实现:
Process.GetCurrentProcess().ProcessorAffinity = new IntPtr(2); // Use only the second core
为了能独占CPU内核,我们必须防止其他线程可以使用此CPU内核。我们设置进程和线程的优先级,来 实现这一目标:
Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.High;
Thread.CurrentThread.Priority = ThreadPriority.Highest;
最后,但并非不重要的,在我们的测试需要热身阶段。在我的系统中,1000-1500毫秒热身阶段之后结 果是稳定的。我们可以用stopwatch自己来控制热身(这里至少1200mS):
stopwatch.Start();
while (stopwatch.ElapsedMilliseconds < 1200)
{
result = TestFunction(seed, count);
}
stopwatch.Stop();