当您测量函数的性能时,如何清空缓存

时间:2010-10-30 14:30:47

标签: windows winapi caching virtual-memory

CPU缓存总是会中断我们测试某些代码的性能。

gettime();
func1();
gettime();

gettime();
func2();
gettime();
// func2 is faster because of the cache.(or page faults of func1())
// But we often misunderstand.

当您衡量代码性能时,如何消除缓存的影响。

我在Windows中找到了一些功能或方法 请给我你的好建议。感谢。

2 个答案:

答案 0 :(得分:1)

您可以做的一件事是调用一个包含大量代码的函数,并在调用您正在分析的项目之间访问大量内存。例如,在伪代码中(主要是语言中立):

// loop some number of times
{
  //start timing
  profile_func();
  //stop timing
  //add to total time
  large_func(); // Uses lots of memory and has lots of code
}
// Compute time of profile func by dividing number of iterations by total time

large_func()中的代码可以是无意义的代码,就像重复的一组操作一样 过度。关键是它或它的代码在编译时没有得到优化,因此它实际上清除了CPU的代码和数据缓存(以及L2和L3(如果存在)缓存)。 p>

对于许多情况,这是一个非常重要的测试。重要的是,通常在隔离中进行分析的小型快速函数可以非常快速地运行,利用CPU缓存,内联和注册。但是,通常情况下,在大型应用程序中,由于调用这些快速函数的上下文,因此不存在这些优点。

作为一个例子,仅通过在紧密循环中运行一百万次迭代来分析函数可能会显示该函数在50纳秒内执行。然后你使用我上面展示的框架运行它,突然间它的运行时间可以大大增加到几微秒,因为它不再利用它拥有整个处理器 - 它的寄存器和缓存本身的事实。

答案 1 :(得分:0)

好的代码利用了缓存,因此您不能将其关闭(您可以,但这些结果将完全无关)。

您需要在连续测试之间清空(或使无效)缓存。以下是一些提示:Invalidating the CPU's cache