0

我们在课堂上一直在使用gettimeofday.

令人惊讶的是,经过多次重复(每次执行 3 次测量,执行 3 次)后,我们发现写入 2500MB 的文件比在两个 HDD 上写入较小的文件要快。

带宽图表

这是我们的 C 代码。它从 python 脚本调用以生成一些图表。

//argv[1] = path, argv[2] = size in MB (2500 in this case)

#include <stdio.h>
#include <sys/time.h>
#include <time.h>
#include <unistd.h>
#include <fcntl.h>


struct timeval tv0;
struct timeval tv1;

int main(int argc, char *argv[]){
    unsigned long size=atoi(argv[2])*1000L*1000L;
    int f = open(argv[1], O_CREAT|O_WRONLY|O_TRUNC, 0777);
    char * array = malloc(size);
    gettimeofday(&tv0, 0); //START TIME
    write(f, array, size);
    fdatasync(f);
    close(f);
    gettimeofday(&tv1, 0); // END TIME 
    double seconds = (((double)tv1.tv_sec*1000000.0 + (double)tv1.tv_usec) - ((double)tv0.tv_sec*1000000.0 + (double)tv0.tv_usec))/1000000.0;
    printf("%f",seconds);
}

老师不知道,所以我在这里问:有可能发生这种情况吗?

4

1 回答 1

1

您的基准测试存在严重缺陷:

  • 它假定不检查其所有函数调用都成功且没有错误。
  • 它假定成功时,write()将写入指定给它的全部字节数,但绝不保证会这样做。

如果您的假设结果不被满足,那么其中任何一个都可能很容易地使您的基准测试结果无效,并且至少第二个很可能会以这种方式出现。

特别注意write()返回写入的字节数,作为ssize_t. ssize_t是一个有符号整数类型,其具体宽度取决于系统。如果您的大小为 32 位,则write() 不能在一次调用中写入所有 2500MB 缓冲区,因为这比带符号的 32 位整数可以表示的字节多(限制超过 2100 MB)。

此外,您的程序假定它可以成功分配非常大的内存块,但事实并非如此。但是,如果此假设失败,您可能会因崩溃而获得回报。

于 2016-04-04T19:31:23.327 回答