测试NTFS, FAT, EXT4的写/读速度
Testing write/read speed on NTFS, FAT, EXT4
我必须在Linux
中用C(或c++)编写一个程序,该程序将测试不同文件系统上的写入和读取速度。我必须确保所有数据都写入磁盘(而不是在缓存中)。
所以我的第一个问题-我应该用什么函数来打开一个新文件?我使用之前的open
函数,参数为O_DIRECT
和O_SYNC
,一切都很好,除了一件事-写像1KB这样的小文件非常慢,大约为0.01MB/s。
我尝试使用fopen
函数代替open
, fflush
函数以确保所有数据都直接写入磁盘,我首先在FAT32
文件系统上进行了测试。1000个1KB的文件在5秒内写入磁盘(这里是SD卡),大约0.18MB/s,我认为这是正确的。
现在测试EXT4
和NTFS
文件系统时会出现这个问题。在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
,所以问题就在这里。
是否有办法在最后,当所有的文件被写入时调用它?或者每隔几秒钟?我必须使用不同的线程吗?
参见如何确保数据在关闭fstream之前被写入磁盘?但我不认为你可以确保数据实际上是在磁盘上,而不是在磁盘控制器的缓存中,甚至在驱动器的板载缓存
相关文章:
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- 在C++中使用并行化的预期速度是多少(不是 OpenMp,而是 <thread>)
- 为什么这些算法的运行速度比它们应该的要快?
- 如何提高文件的读取速度?
- 通过libpqxx提高PostgreSQL数据库的更新速度
- 使用 IMFSinkWriter 编码的视频的播放速度会根据宽度而变化
- 如何加快大字符串的解析速度?
- 使用"静态"如何影响我的代码速度?
- 当 2 个线程共享同一物理内核时,具有错误共享的易失性增量在发布中的运行速度比在调试中慢
- Arduino 上数学运算的计时速度 - 异常
- 不同基元类型的乘法速度
- 为什么 printf 在 C++ 中的执行速度比 cout 快?另外scanf比cin慢,为什么?
- Visual Studio 2015 中的调试速度很慢 -- 无法关闭页面堆?
- 有人可以解释为什么使用 OpenMP 部分的运行速度比单个线程慢吗?
- 相同的 c 和 c++ 程序之间的巨大速度差异
- C++ OpenMP 斐波那契:1 个线程的执行速度比 4 个线程快得多
- 如何提高 ifstream 和 ofstream 的读写速度 std::vector<uint8_t>
- 获取闪存驱动器的读写速度
- C++-全局变量与局部变量的读/写速度
- 测试NTFS, FAT, EXT4的写/读速度