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

C 如何测量文件I/O的挂钟时间,c,benchmarking,C,Benchmarking,我正在用C编写几个基准程序,以实现以下任务: 从网络磁盘读取数据的速度。打印读取8192字节所需的秒数 从本地计算机上的本地目录/tmp读取的速度。打印读取8192字节所需的秒数 从磁盘页缓存读取的速度。打印读取8192字节所需的秒数 写入网络磁盘的速度。打印写入8192字节所需的秒数 可以写入本地计算机上的本地目录/tmp的速度。打印写入8192字节所需的秒数 这里的目标是测量读取或写入文件所需的时间(使用read和write以避免fread产生任何缓冲时间) 对于1和2,我的一般方法是创建一

我正在用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);
    }
    
    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;
    }