【问题标题】:How do you empty a cache when we you measure function's performance当我们测量函数的性能时,如何清空缓存
【发布时间】:2010-10-30 14:30:47
【问题描述】:

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

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

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

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

我正在寻找一些在 Windows 中执行此操作的功能或方法。
请给我你的好建议。谢谢。

【问题讨论】:

  • 如果没有任何缓存,性能通常会很糟糕。我宁愿尝试在代表性(即缓存)平台上测量代表性工作负载。
  • 你想像题主说的那样时不时清空缓存吗?还是您想像问题本身所说的那样完全禁用缓存?
  • 我想公平地运行这些功能。就这样。如果 func1 没有被缓存,则 func2 也不能被缓存。如果 func1 导致页面错误,则 func2 也会。当然,我希望它们都不会导致页面错误。

标签: windows winapi caching virtual-memory


【解决方案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(如果存在)缓存)。

对于许多情况来说,这是一个非常重要的测试。这很重要的原因是,经常被单独分析的小型快速函数可以运行得非常快,利用 CPU 缓存、内联和注册。但是,由于调用这些快速函数的上下文,通常在大型应用程序中没有这些优势。

例如,仅通过在紧密循环中运行一百万次迭代来分析函数可能会表明该函数在 50 纳秒内执行。然后你使用我上面展示的框架运行它,突然之间它的运行时间会急剧增加到几微秒,因为它不能再利用它拥有整个处理器的事实——它的寄存器和缓存,都属于自己。

【讨论】:

    【解决方案2】:

    好的代码会利用缓存,所以你不能只关闭它(你可以,但这些结果将完全无关紧要)。

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

    【讨论】:

      猜你喜欢
      • 2010-10-24
      • 2010-12-24
      • 1970-01-01
      • 2019-02-10
      • 2015-06-27
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 2010-10-03
      相关资源
      最近更新 更多