Coo*_*der 4 c++ memory caching
首先,我想告诉我,我来自非计算机科学背景,我一直在学习C++语言.我无法理解什么是缓存?它在不同的背景下有不同的含义.我想知道在C++程序中什么叫做缓存?例如,如果我int在文件中有一些数据.如果我读它并存储在int数组中,那么这是否意味着我已经"缓存"了数据?对我而言,这似乎是使用数据的常识,因为从文件读取总是比从RAM读取更糟糕.但由于这篇文章,我有点困惑.
在CPU中,可以有多个缓存,以加速循环中的指令或存储经常访问的数据.这些缓存很小但很快.从高速缓冲存储器读取数据比从RAM读取数据要快得多.
它说从缓存中读取数据比从RAM中读取数据要快得多.我以为RAM和缓存是一样的.有人可以清除我的困惑吗?
编辑:我正在更新问题,因为以前它太宽泛了.我的困惑始于这个答案.他说
RowData和m_data特定于我的实现,但它们仅用于缓存有关文件中某行的信息
在这种情况下缓存意味着什么?
tad*_*man 12
任何现代CPU都有几层缓存,通常命名为L1,L2,L3或甚至L4.这称为多级缓存.数字越小,缓存越快.
重要的是要记住CPU以比内存子系统快得多的速度运行.等待从系统内存中取出某些东西需要CPU一个小小的永恒,从请求发出到获取数据,通过系统总线发送并由CPU接收的时间过去很多很多时钟周期.
没有用于处理缓存的编程结构,但如果您的代码和数据可以整齐地放在L1缓存中,那么它将是最快的.接下来是它是否适合L2,依此类推.如果您的代码或数据根本不适合,那么您将受制于系统内存,这可能会慢几个数量级.
这就是为什么反直观的事情,如展开循环,这应该更快,可能最终会变慢,因为你的代码变得太大而无法适应缓存.这也是为什么从数据结构中删除几个字节可能会带来巨大的回报,即使内存占用几乎没有变化.如果它整齐地适合缓存,它会更快.
了解您是否存在与缓存相关的性能问题的唯一方法是非常仔细地进行基准测试.请记住,每种处理器类型都有不同数量的缓存,因此在i5上可能运行良好的i7 CPU可能相对较差.
只有在性能极为敏感的应用程序中,缓存才真正成为您所担心的问题.例如,如果您需要在游戏中保持稳定的60FPS帧速率,您将不断查看缓存问题.每毫秒都算在这里.同样地,任何长时间以100%运行CPU的东西,例如渲染视频,都需要非常密切地关注调整发出的代码可以获得多少.
您可以控制使用编译器标志生成代码的方式.有些会生成较小的代码,有些通过展开循环和其他技巧在理论上会更快.找到最佳设置可能是一个非常耗时的过程.同样,您需要非常小心地关注数据结构以及它们的使用方式.