【发布时间】:2014-12-15 19:09:15
【问题描述】:
我正在用 C 编写几个基准程序来完成以下任务:
- 从网络磁盘读取的速度。打印读取 8192 个字节所需的秒数。
- 从本地计算机上的本地目录 /tmp 读取的速度。打印读取 8192 个字节所需的秒数。
- 从磁盘页面缓存中读取的速度。打印读取 8192 个字节所需的秒数。
- 写入网络磁盘的速度。打印写入 8192 字节所需的秒数。
- 写入本地计算机上本地目录 /tmp 的速度。打印写入 8192 字节所需的秒数。
这里的目标是测量执行文件读取或写入所花费的时间(使用read 和write 以避免来自fread 的任何缓冲时间)
我对 1 和 2 的一般做法是创建一个 8192 字节的文件并将其写入磁盘(无论是本地目录还是网络磁盘),然后调用 sleep(10) 等待页面缓存刷新所以我正在测量实际 I/O 的时间,而不是缓存 I/O。然后我测量了数千次空for循环所需的时间,然后是读取8192字节所需的时间,然后减去两者,除以所有迭代的平均值。我的代码如下:
struct timespec emptyLoop1, emptyLoop2;
clock_gettime(CLOCK_REALTIME, &emptyLoop1);
for(i = 0, j = 0; i < ITERATIONS; i++) {
j+=i*i;
}
clock_gettime(CLOCK_REALTIME, &emptyLoop2);
char readbuf[NUM_BYTES];
struct timespec beforeRead, afterRead;
clock_gettime(CLOCK_REALTIME, &beforeRead);
for(i = 0, j = 0; i < ITERATIONS; i++){
j+=i*i;
read(fd, readbuf, NUM_BYTES);
}
这足以准确测量从这些位置读取的时间吗?
接下来,我对如何从页面缓存中读取感到困惑。它存在于磁盘上的什么位置,我如何访问它?最后,4 和 5 的一些技巧显然比看起来要难得多,但我不确定我错过了什么。
【问题讨论】:
-
关于1和2:看看this 关于4和5:你应该刷新缓冲区才能实际写入(主要用于本地目录)。检查 fflush 的手册页
-
关于1、2、3:第一次读取网络驱动器和本地驱动器后,它们不会在内存缓存中吗?
标签: c benchmarking