1

我们有时必须在我们想要测量运行时间的地方运行一些 CPU 密集型测试。测试持续大约一分钟。问题在于,从运行到运行运行时变化很大(+/- 5%)。我们怀疑这种变化是由系统上其他应用程序/服务的活动引起的,例如:

  • 在空闲时间做家务的应用程序(例如 Visual Studio 更新 IntelliSense)
  • 文件系统索引器
  • ETC..

有什么技巧可以让我们的基准测试时间更稳定?

目前我们最小化所有其他应用程序,以“高于正常”优先级运行测试,并且在运行测试时不触摸机器。

4

4 回答 4

1

首先,如果只是对应用程序本身进行基准测试,您应该使用 CPU 时间,而不是挂钟时间作为衡量标准。然后(几乎)不受其他进程或系统所做工作的影响。其次,正如迪肯里德所指出的,更多的重复可以增加信心。

于 2009-03-09T10:41:31.527 回答
1

通常的方法是执行大量重复,然后丢弃异常值。因此,如果像磁盘索引器这样的干扰仅每隔一小时左右出现一次,并且您在 24 小时内重复运行 5 分钟,那么您将获得大量结果而没有任何阻碍。绘制概率密度函数以确保您了解正在发生的事情是一个好主意。此外,如果您对启动效果(例如将所有内容放入处理器缓存)不感兴趣,请确保实验运行足够长的时间以使它们变得微不足道。

于 2009-03-09T10:32:20.143 回答
1

引用 VC++ 团队博客,他们如何进行性能测试

为了降低基准测试机器上的噪音,我们采取了几个步骤:

  1. 停止尽可能多的服务和进程。
  2. 禁用网络驱动程序:这将关闭由>广播数据包引起的网卡中断。
  3. 将测试的处理器关联设置为仅在一个处理器/内核上运行。
  4. 将运行设置为高优先级,这将减少上下文切换的数量。
  5. 运行几次迭代的测试。
于 2009-05-17T14:02:49.583 回答
0

我执行以下操作:

  1. 调用方法x次并测量时间
    • 这样做 n 次并计算这些测量值的平均值和标准偏差

尝试使 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));
}
于 2009-03-09T10:43:48.277 回答