我正在用C语言编写多个基准测试程序来完成以下任务:
1. 从网络磁盘读取数据的速度。打印读取8192字节所需的秒数。 2. 从本地计算机上的/tmp目录读取数据的速度。打印读取8192字节所需的秒数。 3. 从磁盘页缓存读取数据的速度。打印读取8192字节所需的秒数。 4. 向网络磁盘写入数据的速度。打印写入8192字节所需的秒数。 5. 向本地计算机上的/tmp目录写入数据的速度。打印写入8192字节所需的秒数。
这里的目标是仅测量执行文件读取或写入操作所需的时间(使用read和write函数,避免fread的任何缓冲时间)。
我的一般做法是创建一个8192字节的文件并将其写入磁盘(无论是本地目录还是网络磁盘),然后调用sleep(10)等待页面缓存刷新,以便衡量实际I/O而不是缓存I/O的时间。然后我测量执行空for循环需要的时间,接着测量读取8192字节所需的时间,再减去两者之间的时间差,最后除以所有迭代中的平均值。我的代码如下:
1. 从网络磁盘读取数据的速度。打印读取8192字节所需的秒数。 2. 从本地计算机上的/tmp目录读取数据的速度。打印读取8192字节所需的秒数。 3. 从磁盘页缓存读取数据的速度。打印读取8192字节所需的秒数。 4. 向网络磁盘写入数据的速度。打印写入8192字节所需的秒数。 5. 向本地计算机上的/tmp目录写入数据的速度。打印写入8192字节所需的秒数。
这里的目标是仅测量执行文件读取或写入操作所需的时间(使用read和write函数,避免fread的任何缓冲时间)。
我的一般做法是创建一个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方面有一些技巧,它们显然比看起来要难得多,但我不确定我错过了什么。