2

我正在使用 mmap 调用使用 C++ 中的简单指针算法从一个非常大的文件中读取。问题是,当我多次读取小块数据(以 KB 为单位)时,每次读取所花费的时间与前一次读取的时间相同。我如何知道是否正在访问磁盘以完成我的请求,或者在第一个请求之后的调用中是否正在从主内存(页面缓存)完成请求。

4

2 回答 2

5

问题如下:两次读取都是从缓存中执行的。我猜缓存在打开或映射文件时开始,然后再询问数据。为了验证这一点,我发布了:

echo 3 > /proc/sys/vm/drop_caches

这会刷新缓存,然后,如果我运行两次迭代以获取相同的数据,则第一次运行(在我的情况下)比第二次慢 10 倍。

于 2010-04-23T15:10:17.127 回答
0

如果您利用引用的局部性,您将获得最佳的缓存性能. 也就是说,如果您访问在内存中靠得很近的变量(例如,通过变量按递增顺序步进)并且您及时执行这些访问(即在读取这些元素之间不执行许多其他内存访问),那么您将获得最佳的缓存性能。如果每次读取花费的时间大致相同,那么它很可能被缓存了;如果没有从缓存中提供服务,这通常表示为几次快速读取(缓存命中),然后是尖峰(缓存未命中),然后是更快速的读取。在几乎所有系统上,缓存未命中会导致数据所在的块加载到缓存中,因此如果您访问附近的变量(位于同一块中),它们将位于缓存中。

于 2010-04-23T07:50:32.883 回答