10

首先我想说我来自非计算机科学背景并且我一直在学习 C++ 语言。我无法理解缓存到底是什么?它在不同的语境中有不同的含义。我想知道在 C++ 程序中什么叫做缓存?例如,如果我int在文件中有一些数据。如果我读取它并存储在一个int数组中,那么这是否意味着我已经“缓存”了数据?对我来说,使用数据似乎是常识,因为从文件读取总是比从 RAM 读取差。但是由于这篇文章,我有点困惑。

在 CPU 中可以有多个缓存,以加速循环中的指令或存储经常访问的数据。这些缓存很小但非常快。从高速缓存中读取数据比从 RAM 中读取数据要快得多。

它说从缓存中读取数据比从 RAM 中读取数据要快得多。我认为RAM和缓存是一样的。有人可以解决我的困惑吗?

编辑:我正在更新这个问题,因为以前它太宽泛了。我的困惑始于这个答案。他说

RowData 和 m_data 特定于我的实现,但它们仅用于缓存有关文件中行的信息

在这种情况下缓存是什么意思?

4

4 回答 4

20

任何现代 CPU 都有多层缓存,通常被命名为 L1、L2、L3 甚至 L4。这称为多级缓存。数字越小,缓存速度越快。

重要的是要记住 CPU 的运行速度明显快于内存子系统。CPU 需要很短的时间来等待从系统内存中获取某些内容,从发出请求到获取数据、通过系统总线发送并被 CPU 接收,这需要很多很多时钟周期.

没有用于处理缓存的编程结构,但是如果您的代码和数据可以整齐地放入 L1 缓存中,那么它将是最快的。接下来是它是否适合 L2,依此类推。如果您的代码或数据根本无法容纳,那么您将受制于系统内存,这可能会慢几个数量级。

这就是为什么像展开循环这样的反直觉的事情,应该更快,但最终可能会变慢,因为您的代码变得太大而无法放入缓存中。这也是为什么即使内存占用几乎没有变化,从数据结构中删除几个字节也会带来巨大的好处。如果它整齐地放入缓存中,它会更快。

了解您是否存在与缓存相关的性能问题的唯一方法是非常仔细地进行基准测试。请记住,每种处理器类型都有不同数量的缓存,因此在 i7 CPU 上运行良好的缓存在 i5 上可能相对较差。

只有在对性能极其敏感的应用程序中,缓存才真正成为您担心的事情。例如,如果您需要在游戏中保持稳定的 60FPS 帧速率,您将不断查看缓存问题。每一毫秒都很重要。同样,任何长时间以 100% 运行 CPU 的东西,例如渲染视频,都需要非常密切地关注它们可以从调整发出的代码中获得多少收益。

您确实可以控制如何使用编译器标志生成代码。有些会产生更小的代码,有些理论上会通过展开循环和其他技巧更快。找到最佳设置可能是一个非常耗时的过程。同样,您需要非常小心地注意您的数据结构以及它们的使用方式。

于 2013-09-18T18:21:50.177 回答
2

[缓存]在不同的上下文中具有不同的含义。

答对了。以下是一些定义:

缓存

动词

定义:将数据放置在比当前位置更有效或更可靠地检索数据的位置。例如:

  • 将文件从某个远程计算机复制到本地硬盘驱动器
  • 将数据从本地硬盘驱动器上的文件复制到主内存
  • 当值存储在过程或面向对象程序中的某种容器类型中时,将值复制到变量中。

示例: “我要将值缓存在主内存中”,“您应该缓存它,查找成本很高”

名词1

定义:可能比源数据更容易立即访问的数据副本。

示例: “请将其保存在您的缓存中,不要过多访问我们的服务器”

名词2

定义:位于处理器芯片上的快速访问内存区域,现代 CPU 通常具有多个级别的缓存。请参阅cpu 缓存,注意 GPU 和其他类型的处理器也会有自己的缓存,具有不同的实现细节。

示例: “考虑将数据保存在一个数组中,以便按顺序访问它是缓存一致的”

于 2013-09-18T18:26:47.983 回答
0

我正在更新这个问题,因为以前它太宽泛了。我的困惑始于这个答案。他说

RowData and m_data are specific to my implementation,
but they are simply used to cache information about a row in the file

在这种情况下缓存是什么意思?

这种特殊用途意味着它RowData作为一个副本保存在内存中,而不是每次我们需要一些数据时从文件中读取(一点点)行。从文件中读取比在程序内存中保存数据副本要慢得多 [1]。

[1] 尽管在现代操作系统中,来自硬盘的实际数据可能保存在内存中,在文件系统缓存中,以避免必须多次读取磁盘才能一遍又一遍地获取相同的数据。但是,这仍然意味着需要将数据从文件系统缓存复制到使用该数据的应用程序。

于 2013-09-18T19:36:51.627 回答
0

我对缓存的定义是数量有限但访问速度更快的东西,因为要寻找的区域更少。如果您在谈论任何编程语言中的缓存,那么这意味着您正在内存中以变量的形式存储一些信息(变量不是在内存中定位数据的方法)。这里的内存指的是RAM物理缓存(CPU 缓存)

物理/CPU缓存只不过是比RAM更多使用的内存,它实际上将一些数据的副本存储在CPU经常使用的RAM上。在那之后,您还有另一个级别的分类,即板载缓存(更快)和板外缓存。你可以看到这个链接

于 2013-09-18T18:17:20.910 回答