我们有时必须运行一些CPU绑定测试来测量运行时。测试持续一分钟。问题是从运行到运行,运行时间变化很大(+/- 5%)。我们怀疑这种变化是由系统上其他应用程序/服务的活动引起的,例如:
有什么建议让我们的基准时间更稳定?
目前我们最小化所有其他应用程序,以“高于正常”优先级运行测试,而不是在运行测试时触摸机器。
答案 0 :(得分:1)
通常的方法是执行大量重复,然后丢弃异常值。因此,如果像磁盘索引器那样的干扰只会每小时左右出现一次,并且你会在5小时内重复运行24小时,那么你就会有很多结果,没有任何障碍。绘制概率密度函数以确保您了解正在发生的事情是一个好主意。此外,如果您对启动效果不感兴趣,例如将所有内容都放入处理器缓存中,请确保实验运行的时间足够长,以使它们无关紧要。
答案 1 :(得分:1)
首先,如果只是对应用程序本身进行基准测试,则应使用CPU时间,而不是使用挂钟时间作为度量。然后(几乎)不受其他进程或系统所做的影响。其次,正如Dickon Reed pointed out,更多的重复会增加信心。
答案 2 :(得分:1)
引用VC ++团队博客,他们如何做performance tests:
为减少基准测试机上的噪音,我们采取以下几个步骤:
- 尽可能多地停止服务和流程。
- 禁用网络驱动程序:这将关闭由>广播数据包引起的NIC中断。
- 将测试的处理器关联性设置为仅在一个处理器/核心上运行。
- 将运行设置为高优先级,这将减少上下文切换次数。
- 运行测试几次。
醇>
答案 3 :(得分:0)
我执行以下操作:
尝试将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));
}