最近Herb Sutter在“现代C++:你需要知道的”上做了一个很棒的演讲。这个演讲的主题是效率以及数据局部性和内存访问的重要性。
他还解释了线性访问内存(数组/向量)将会受到CPU的喜爱。他引用了另一个经典参考来源“Bob Nystrom的游戏性能”中的一个例子来说明这个问题。
阅读这些文章后,我发现有两种类型的缓存会影响程序性能:
- 数据缓存
- 指令缓存
Cachegrind工具也可以测量我们程序的这两种缓存类型的仪器信息。第一个点已经由许多文章/博客解释过了,以及如何实现良好的数据缓存效率(数据局部性)。
然而,我对指令缓存这个主题并没有得到太多信息,以及我们应该在程序中注意什么以实现更好的性能?据我理解,我们程序员没有太多控制权来决定执行哪些指令或以什么顺序执行。
如果有一些小的C++程序可以说明这个计数器(即指令缓存)如何随着我们编写程序的风格而变化那将非常好。程序员应该遵循哪些最佳实践才能在这个方面实现更好的性能呢?
我的意思是,如果我们的程序处理数据缓存相关话题,比如向量 vs 列表,是否有可能解释第二点?这个问题的主要目的是尽可能地理解这个主题。