为什么同样程序的执行是第一次
问题描述:
我工作的一个C程序(Ubuntu的14.04),做后基本上快了很多:为什么同样程序的执行是第一次
- 打开一个1GB的文件
- 由缓冲区中读取它的1MB
- 查找在缓冲
- 某些对象计算各对象的MD5签名发现
我的节目采取10个secondes第一添e来实现这一点,然后下一次只需要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);
}
答
因为第二次,大部分的程序代码和大多数文件数据都已经坐在page cache(和内核不需要任何磁盘I/O,让他们到RAM中)
如果您在运行您自己的代码之前对其依次读取的大文件运行其他程序(如cat
或wc
),您可能会观察到类似的加速。
又见posix_fadvise(2),sync(2) &特定Linux的readahead(2) & http://www.linuxatemyram.com/;在运行程序测量内存之前,期间和之后使用free(1)命令。另请阅读proc(5),因为/proc/
包含很多有用的伪文件,描述了您的机器或您的进程的内核状态。
也可以使用time(1),或许作为/usr/bin/time -v
,以基准几次您的程序。另请参阅time(7) & getrusage(2) ...
+0
实际上,我可以看到额外1GB的带有空闲命令的RAM,但不能与系统监视器应用程序一起使用。谢谢 :) –
请发布您的代码。 – LPs
从磁盘读取1GB文件可能需要将近10秒钟的时间。在内存中时,操作系统会将其保留一段时间,因为有人可能想再次阅读它。 –
它也取决于操作系统。 –