如何衡量冷代码性能?

时间:2011-12-01 08:27:18

标签: c# performance

假设我有两种方法,FooBar,它们大致相同,我想测量哪一种更快。此外,FooBar的单次执行速度太快,无法可靠地进行衡量。

通常情况下,我会像这样简单地运行它们:

var sw=new Stopwatch();
sw.Start();
for(int ii=0;ii<HugeNumber;++ii)
    Foo();
sw.Stop();
Console.WriteLine("Foo: "+sw.ElapsedMilliseconds);
// and the same code for Bar

但是这样,第一次运行后Foo的每次运行都可能与处理器缓存有关,而不是实际的内存。这可能比实际应用程序更快。我该怎么做才能确保我的方法每次都冷却?

澄清 通过“大致相同的事情”我的意思是两种方法以相同的方式使用,但实际算法可能显着不同。例如,Foo可能正在做一些棘手的数学运算,而Bar通过使用更多内存来跳过它。

是的,我知道在寒冷中运行的方法不会对整体性能产生太多影响。我仍然对哪一个更快感兴趣。

2 个答案:

答案 0 :(得分:1)

首先,如果Foo使用处理器缓存,那么Bar也将使用处理器缓存。不应该吗?????????所以你的两个功能都得到了同样的优势。现在假设在第一次foo的时间之后是A然后它正在以平均时间B运行,因为它正在使用处理器缓存。所以总时间将是

A + B*(hugenumber-1)

同样对于Bar来说,它将是

C + D*(hugenumber-1) //where C is the first runtime and D is the avg runtime using prscr cache

如果我没错,那么结果取决于B和D,它们都是使用处理器缓存的平均运行时间。因此,如果你想计算你的哪个函数更好,那么事物处理器缓存不是问题,因为两个函数都假设使用它。

编辑:

我认为现在很清楚。由于Bar正在通过使用内存来跳过一些棘手的数学,因此它会有一点点(可能是纳秒/微秒)优势。所以为了限制你必须在你的for循环中刷新你的cpu缓存。就像在两个循环中一样,你会做同样的事情,我想现在你会更好地了解哪个函数更好。关于如何刷新cpu缓存已经有堆栈溢出讨论。请查看此link 希望它有所帮助。

编辑详细信息:改进答案并更正拼写

答案 1 :(得分:0)

但假设FooBar足够相似,任何缓存加速(或任何其他环境因素)应该同等地影响两者。因此,即使您可能无法获得准确的冷性能绝对测量值,您仍应观察算法之间存在的相对差异。

还要记住,如果在系统的内部循环中调用这些函数(否则为什么你会如此关心它们的性能),在现实世界中,无论如何它们都可能被保存在缓存中,所以通过使用你的代码可能会得到与现实世界性能相当的近似值。