我必须用Linux用C(或C++)编写一个程序,该程序将测试不同文件系统上的读写速度。我必须确保所有数据都写入磁盘(不在缓存中)。

所以我的第一个问题-我应该使用什么功能打开一个新文件?我在使用参数openO_DIRECTO_SYNC函数之前使用过,一切都很好,除了一件事-编写1KB这样的小文件非常慢,大约0.01MB / s。

我尝试使用fopen函数而不是openfflush函数来确保所有数据都直接写入磁盘,并且首先在FAT32文件系统上对其进行了测试。在5秒钟内将1000个1KB的文件写入磁盘(此处为SD卡)。大约0.18MB / s,我认为是正确的。

现在,在测试EXT4NTFS文件系统时出现问题。在EXT4上。 1KB文件的写入速度约为12MB / s(错误),而在测试100KB传输时为180MB / s(非常错误,我的SD卡的传输速率仅为20MB / s)。

我写文件的实际代码如下所示:

clock_gettime(CLOCK_REALTIME, &ts);

for ( int i = 0; i < amount; ++i)
{
    p = fopen(buffer2, "w+");

    fwrite(buff, size*1024, 1, p);
    if ( fflush(p) != 0 ) { cout << "fflush error"; return 0; }

    fclose(p);
}

clock_gettime(CLOCK_REALTIME, &ts2);

time2 = diff2(ts,ts2);

仅适用于FAT32文件系统。第二个代码(之前使用)如下所示:
for ( int i = 0; i < amount; ++i)
{
    int fd = open(buffer2, O_WRONLY | O_CREAT, 0777);
    if ( error(fd, "open") ) return false;

    if ( (write(fd, buff, size*1024)) < 0 ) { perror("write error"); return 0; }

    if ( (fsync(fd)) == -1 ) { perror("fsync"); return 0; }

    close(fd);
}

适用于所有文件系统,但是小文件写入速度非常慢。
也许我应该对不同的文件系统使用不同的代码?有任何想法吗?
EDIT:

我发现了为什么写小文件很慢。这是因为存在fsync函数,并且在不同的文件系统上花费的时间也不同。我每次写都会调用fsync,所以这就是问题所在。

写入所有文件后,到底有什么方法可以调用它?也许每隔几秒钟?我是否必须使用其他线程?

最佳答案

请参阅How do I ensure data is written to disk before closing fstream?,但我认为您无法确保数据实际上在磁盘上,而不是在磁盘 Controller 甚至驱动器的板载缓存中

关于c++ - 测试NTFS,FAT,EXT4上的写入/读取速度,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15951858/

10-11 23:20
查看更多