为什么在第一次

时间:2015-10-07 08:27:12

标签: c caching

我正在研究基本上完成的C程序(Ubuntu 14.04):

  • 打开1GB文件
  • 通过缓冲区1MB
  • 读取
  • 在缓冲区中查找某些对象
  • 计算找到的每个对象的MD5签名

我的程序第一次执行此操作需要10次,然后下次只进行1次(即使我处理初始文件的第二份副本)。

我知道这与缓存有关,我的程序第一次使用缓存数据吗?或直接显示缓存结果而不进行任何计算?

int main(int argc, char** argv) {
unsigned char buffer[BUFFER_SIZE];
int i, number, count = 0;
int start, end = 0;
FILE *file;
file = fopen("/dump/ram.lime", "r");
if (file != NULL) {
    while ((number = fread(buffer, 1, BUFFER_SIZE, file)) > 0) {           
        for (i = 0; i < number; i++) {
            find_object(buffer, &start, &end);
            md5_compute(&buffer[start], end - start);
        }
    }
} else {
    printf("errno %d \n", errno);
}
printf("count = %d \n", count);
return (EXIT_SUCCESS);

}

1 个答案:

答案 0 :(得分:1)

因为第二次,大多数程序代码和大部分文件数据都已经位于page cache(并且内核不需要任何磁盘I / O就可以将它们放入RAM中)

如果您在运行自己的代码之前依次读取该文件的大文件上运行任何其他程序(如catwc),您可能会发现类似的加速。

另请参阅posix_fadvise(2)sync(2)&amp;特定于Linux的readahead(2)&amp; http://www.linuxatemyram.com/;在运行程序之前,期间和之后使用free(1)命令来测量内存。另请阅读proc(5),因为/proc/包含许多有用的伪文件,用于描述机器或过程的内核状态。

也可以使用time(1)(可能是/usr/bin/time -v)对您的计划进行多次基准测试。另见time(7)&amp; getrusage(2) ......