我们有时必须在我们想要测量运行时间的地方运行一些 CPU 密集型测试。测试持续大约一分钟。问题在于,从运行到运行运行时变化很大(+/- 5%)。我们怀疑这种变化是由系统上其他应用程序/服务的活动引起的,例如:
- 在空闲时间做家务的应用程序(例如 Visual Studio 更新 IntelliSense)
- 文件系统索引器
- ETC..
有什么技巧可以让我们的基准测试时间更稳定?
目前我们最小化所有其他应用程序,以“高于正常”优先级运行测试,并且在运行测试时不触摸机器。
我们有时必须在我们想要测量运行时间的地方运行一些 CPU 密集型测试。测试持续大约一分钟。问题在于,从运行到运行运行时变化很大(+/- 5%)。我们怀疑这种变化是由系统上其他应用程序/服务的活动引起的,例如:
有什么技巧可以让我们的基准测试时间更稳定?
目前我们最小化所有其他应用程序,以“高于正常”优先级运行测试,并且在运行测试时不触摸机器。
首先,如果只是对应用程序本身进行基准测试,您应该使用 CPU 时间,而不是挂钟时间作为衡量标准。然后(几乎)不受其他进程或系统所做工作的影响。其次,正如迪肯里德所指出的,更多的重复可以增加信心。
通常的方法是执行大量重复,然后丢弃异常值。因此,如果像磁盘索引器这样的干扰仅每隔一小时左右出现一次,并且您在 24 小时内重复运行 5 分钟,那么您将获得大量结果而没有任何阻碍。绘制概率密度函数以确保您了解正在发生的事情是一个好主意。此外,如果您对启动效果(例如将所有内容放入处理器缓存)不感兴趣,请确保实验运行足够长的时间以使它们变得微不足道。
引用 VC++ 团队博客,他们如何进行性能测试:
为了降低基准测试机器上的噪音,我们采取了几个步骤:
- 停止尽可能多的服务和进程。
- 禁用网络驱动程序:这将关闭由>广播数据包引起的网卡中断。
- 将测试的处理器关联设置为仅在一个处理器/内核上运行。
- 将运行设置为高优先级,这将减少上下文切换的数量。
- 运行几次迭代的测试。
我执行以下操作:
尝试使 x 达到每次测量 > 1 秒的点。这将减少一点噪音。
平均值将告诉您测试的平均性能,标准偏差将告诉您测试/测量的稳定性。
我还将我的应用程序设置为非常高的优先级,并且当我测试单线程算法时,我将它与一个 cpu 核心相关联,以确保没有调度开销。
此代码演示了如何在 .NET 中执行此操作:
Thread.CurrentThread.Priority = ThreadPriority.Highest;
Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.RealTime;
if (Environment.ProcessorCount > 1)
{
Process.GetCurrentProcess().ProcessorAffinity =
new IntPtr(1 << (Environment.ProcessorCount - 1));
}