想要改善这个问题吗?更新问题,以便将其作为on-topic用于堆栈溢出。
7年前关闭。
Improve this question
首先,我想告诉我,我来自非计算机科学背景,并且我一直在学习C++语言。
我无法理解什么是缓存?
在不同的上下文中它具有不同的含义。
我想知道什么在C++程序中称为缓存?
例如,如果我在文件中有一些
int
数据。如果我读取它并存储在int
数组中,那么这是否意味着我已经“缓存”了数据?对我来说,使用数据似乎是常识,因为从文件读取总是比从RAM读取差。
但是由于this的文章,我有些困惑。
它说从缓存中读取数据比从RAM中读取数据快得多。
我以为RAM和缓存是相同的。
有人可以消除我的困惑吗?
编辑:我正在更新问题,因为以前它的范围太广。
我的困惑始于this答案。他说
在这种情况下,高速缓存是什么意思?
最佳答案
任何现代CPU都具有多层缓存,这些缓存通常被命名为L1,L2,L3甚至L4之类的东西。这称为多级缓存。数字越小,高速缓存将越快。
重要的是要记住,CPU的运行速度明显快于内存子系统。 CPU花了很短的时间才能等待从系统内存中获取内容,从发出请求到数据被获取,通过系统总线发送并被CPU接收到经过了许多时钟周期。
没有用于处理缓存的编程结构,但是如果您的代码和数据可以完美地放入L1缓存中,那么它将是最快的。接下来是它是否适合L2,依此类推。如果您的代码或数据根本无法容纳,那么您将受制于系统内存,这可能会慢几个数量级。
这就是为什么展开循环之类的违反直觉的事情(应该更快)可能最终变得更慢的原因,因为您的代码变得太大而无法容纳在缓存中。这也是为什么即使内存占用量几乎没有变化,从数据结构中删除几个字节也可以带来巨大的好处的原因。如果它恰好适合高速缓存,它将更快。
知道是否存在与缓存相关的性能问题的唯一方法是非常仔细地进行基准测试。请记住,每种处理器类型都有不同数量的缓存,因此在i7 CPU上运行良好的功能在i5上可能相对较差。
只有在对性能非常敏感的应用程序中,缓存才真正成为您担心的事情。例如,如果您需要在游戏中保持稳定的60FPS帧频,则您将不断关注缓存问题。每毫秒都在这里计数。同样,任何长时间以100%的CPU运行CPU的条件(例如渲染视频)都需要密切关注它们通过调整所发出的代码可以获取多少 yield 。
您确实可以控制如何使用编译器标志生成代码。有些会产生较小的代码,而理论上会通过展开循环和其他技巧来更快地生成代码。找到最佳设置可能是一个非常耗时的过程。同样,您需要非常注意数据结构及其使用方式。
关于c++ - 什么是C++编程中的缓存? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18878802/