1

我想知道两者的区别

    char *text = (char *)malloc(4096);
    memset(text, 'a', 4096);

    int fd = open(filepath, O_RDWR | O_CREAT | O_DIRECT);

    for(int i=0; i<1000; i++) {
        write(fd, (void *)text, 4096);
        fsync(fd);
    }

    close (fd);

    char *text = (char *)malloc(4096);
    memset(text, 'a', 4096);

    int fd = open(filepath, O_RDWR | O_CREAT | O_DIRECT | O_SYNC); //<----Difference

    for(int i=0; i<1000; i++) {
        write(fd, (void *)text, 4096);
        // fsync(fd);  <--------------------------------------------------Difference
    }

    close (fd);

上面代码的性能比下面的要慢得多。

4

1 回答 1

2

一方面,不应该有任何区别,因为在两种情况下都必须进行类似的工作量(假设没有诡计,写入然后磁盘刷新)。另一方面,第一种情况必须执行两倍的系统调用,因此(理论上)有更多的开销(特别是如果进行系统调用所需的时间是执行操作所需的总时间的重要部分)。很可能这取决于磁盘/内核/CPU/I/O的大小等。两者之间是否存在差异以及哪个更快。也许在第二种情况下,内核可以发送设置了 FUA 位的写入,这意味着差异可能取决于您打开的文件/设备(因为这可能控制是否可以进行这种优化)......

使用O_SYNC还会在调用返回时出现错误,write()但正如其他评论中所述,您没有检查返回码......

于 2021-02-08T20:25:13.567 回答