如何在Windows上获得可重复的CPU绑定基准运行时?

时间:2009-03-09 10:18:50

标签: windows benchmarking

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

  • 在空闲时间内进行内务管理的应用程序(例如Visual Studio更新IntelliSense)
  • 文件系统索引器
  • 等。

有什么建议让我们的基准时间更稳定?

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

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

首先,如果只是对应用程序本身进行基准测试,则应使用CPU时间,而不是使用挂钟时间作为度量。然后(几乎)不受其他进程或系统所做的影响。其次,正如Dickon Reed pointed out,更多的重复会增加信心。

答案 2 :(得分:1)

引用VC ++团队博客,他们如何做performance tests

  

为减少基准测试机上的噪音,我们采取以下几个步骤:

     
      
  1. 尽可能多地停止服务和流程。
  2.   
  3. 禁用网络驱动程序:这将关闭由>广播数据包引起的NIC中断。
  4.   
  5. 将测试的处理器关联性设置为仅在一个处理器/核心上运行。
  6.   
  7. 将运行设置为高优先级,这将减少上下文切换次数。
  8.   
  9. 运行测试几次。
  10.   

答案 3 :(得分:0)

我执行以下操作:

  1. 调用方法x次并测量时间
    • 这样做n次并计算这些测量的平均值和标准差
  2. 尝试将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));
    }