gpt4 book ai didi

c - 如何测量文件 I/O 的挂钟时间

转载 作者:行者123 更新时间:2023-12-02 03:30:08 26 4
gpt4 key购买 nike

我正在用 C 编写几个基准程序来完成以下任务:

  1. 从网络磁盘读取的速度。打印读取 8192 字节所需的秒数。
  2. 从本地机器上的本地目录/tmp 读取的速度。打印读取 8192 字节所需的秒数。
  3. 从磁盘页面缓存读取的速度。打印读取 8192 字节所需的秒数。
  4. 写入网络磁盘的速度。打印写入 8192 字节所需的秒数。
  5. 在本地机器上写入本地目录/tmp 的速度。打印写入 8192 字节所需的秒数。

这里的目标是测量读取或写入文件所花费的时间(使用 readwrite 来避免 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 的技巧,它们显然比看起来要难得多,但我不确定我遗漏了什么。

最佳答案

以下是我的文件读取功能,可以选择使用或不使用基于内存的缓存。如果先写文件,也需要类似的open语句。请注意,不能在 LAN 上使用直接 I/O,并且缓存可能无法预测。可以在 http://www.roylongbottom.org.uk/linux_disk_usb_lan_benchmarks.htm 中找到更多详细信息以及对源代码和执行文件的访问。 .

int readFile(int use, int dsize)
{
int p;

if (useCache)
{
handle = open(testFile, O_RDONLY);
}
else
{
handle = open(testFile, O_RDONLY | O_DIRECT);
}

if (handle == -1)
{
printf (" Cannot open data file for reading\n\n");
fprintf (outfile, " Cannot open data file for reading\n\n");
fclose(outfile);
printf(" Press Enter\n");
g = getchar();
return 0;
}

for (p=0; p<use; p++)
{
if (read(handle, dataIn, dsize) == -1)
{
printf (" Error reading file\n\n");
fprintf (outfile, " Error reading file\n\n");
fclose(outfile);
close(handle);
printf(" Press Enter\n");
g = getchar();
return 0;
}

}
close(handle);
return 1;
}

关于c - 如何测量文件 I/O 的挂钟时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27491314/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com