C 如何测量文件I/O的挂钟时间
我正在用C编写几个基准程序,以实现以下任务:C 如何测量文件I/O的挂钟时间,c,benchmarking,C,Benchmarking,我正在用C编写几个基准程序,以实现以下任务: 从网络磁盘读取数据的速度。打印读取8192字节所需的秒数 从本地计算机上的本地目录/tmp读取的速度。打印读取8192字节所需的秒数 从磁盘页缓存读取的速度。打印读取8192字节所需的秒数 写入网络磁盘的速度。打印写入8192字节所需的秒数 可以写入本地计算机上的本地目录/tmp的速度。打印写入8192字节所需的秒数 这里的目标是测量读取或写入文件所需的时间(使用read和write以避免fread产生任何缓冲时间) 对于1和2,我的一般方法是创建一
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);
}
struct timespec emptyLoop1、emptyLoop2;
时钟获取时间(时钟实时和清空op1);
对于(i=0,j=0;i
这是否足以准确测量这些位置的读数时间
接下来,我对如何读取页面缓存感到困惑。磁盘上的哪个位置存在该文件?如何访问该文件?最后,4和5的一些技巧显然比它们看起来要困难得多,但我不确定我缺少了什么。下面是我的文件读取功能,可以选择使用或不使用基于内存的缓存。如果先写入文件,则需要类似的open语句。请注意,不能通过LAN使用直接I/O,并且缓存可能不可预测。有关源代码和执行文件的更多详细信息和访问权限,请参阅
int-readFile(int-use,int-dsize)
{
INTP;
如果(使用缓存)
{
handle=open(testFile,仅限ordu);
}
其他的
{
handle=open(testFile,O|RDONLY | O|u DIRECT);
}
如果(句柄==-1)
{
printf(“无法打开数据文件进行读取\n\n”);
fprintf(输出文件,“无法打开数据文件进行读取\n\n”);
fclose(输出文件);
printf(“按回车键”);
g=getchar();
返回0;
}
对于(p=0;pAbout 1和2:查看大约4和5:您应该刷新缓冲区以实际写入(主要针对本地目录)。检查手册页以了解FFLUSH大约1、2和3:首次读取网络驱动器和本地驱动器后,它们不会在内存缓存中吗?
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;
}