【问题标题】:Does jumping around in a program hurt performance due to caching issues由于缓存问题,在程序中跳来跳去是否会损害性能
【发布时间】:2012-05-01 05:56:55
【问题描述】:

我知道存在内存缓存,因此使用内存中许多不同点的值会导致缓存未命中并损害性能。当一个程序被执行时,它实际上是以类似于 L1 缓存的小块从内存加载到 cpu 中的吗?我问,因为大概然后频繁地在内存中跳转会导致此缓存未命中并损害性能。所以我想这是两个问题:是否有这样的“执行缓存”并且经常跳来跳去会损害性能。

附:不确定除了性能和缓存之外还有哪些合适的标签。

附言一个示例情况可能是包含大量嵌套 ifs 和 elses 的其他紧密循环,其中每个 if 和 else 嵌套底部的最终结果只是少量代码。

【问题讨论】:

  • 除非你需要你的代码非常快,否则你可能不需要担心缓存未命中。有很多更简单的方法可以优化您的程序。
  • 对于我 99.9% 的代码,我不关心这个。这仅与那些需要非常非常快的少数、罕见但关键部分相关,如何快速处理大量具有高性能的小型相关案例是我目前面临的问题。跨度>

标签: performance caching


【解决方案1】:

是的。这个缓存称为指令缓存。用尽它会对性能产生严重影响。这就是内联函数并不总是有益的原因。内联函数会更快,但臃肿的代码大小可能会将热路径赶出 I-cache。

Linux 内核开发者邮件列表对此主题进行了有趣的讨论。

【讨论】:

  • 因此在您的示例中,您的意思是频繁调用内联函数可能会减慢代码速度,因为经常调用的小函数将被加载到指令缓存中并保留在那里,而不是使代码膨胀为内联导致缓存未命中的函数,因为同一个内联函数正在多个位置加载到指令缓存中。对吗?
  • 指令缓存现在可能有多大(例如,最后我知道,如果我没记错的话,我认为 L1 和 L2 缓存的 16K 和 4M 大约是正确的数量级) ?
  • @JohnRobertson 我无法理解你的第一句话 ;-) 太长,太嵌套。我想说的是,内联一个非常冷的函数会损害性能,因为热代码可能会从缓存中被逐出。内联(最常见)创建 CPU 指令。内联的次数越多,从同一个程序中获得的指令就越多。出于同样的原因,编译器支持优化大小。我的 Core i7 的 I-cache 大小为 32kb。它很小。不确定发送单个 UDP 数据包是否会完全保留在缓存中。
猜你喜欢
  • 1970-01-01
  • 2013-11-26
  • 1970-01-01
  • 2018-02-28
  • 2011-10-13
  • 1970-01-01
  • 2011-01-11
  • 1970-01-01
  • 2011-07-16
相关资源
最近更新 更多