我需要将数据写入驱动器。我有两个选择:
- 写入原始扇区。(_write(handle, pBuffer, size);)
- 写入文件 (fwrite(pBuffer, size, count, pFile);)
哪种方式更快?
我希望原始扇区写入函数 _write 的效率更高。然而,我的测试结果失败了! fwrite 更快。 _write 花费更长的时间。
我已经粘贴了我的代码片段;也许我的代码是错误的。你能帮我吗?无论哪种方式我都可以,但我认为原始写入更好,因为驱动器中的数据似乎至少是加密的......
#define SSD_SECTOR_SIZE 512
int g_pSddDevHandle = _open("\\\\.\\G:",_O_RDWR | _O_BINARY, _S_IREAD | _S_IWRITE);
TIMER_START();
while (ulMovePointer < 1024 * 1024 * 1024)
{
_write(g_pSddDevHandle,szMemZero,SSD_SECTOR_SIZE);
ulMovePointer += SSD_SECTOR_SIZE;
}
TIMER_END();
TIMER_PRINT();
FILE * file = fopen("f:\\test.tmp","a+");
TIMER_START();
while (ulMovePointer < 1024 * 1024 * 1024)
{
fwrite(szMemZero,SSD_SECTOR_SIZE,1,file);
ulMovePointer += SSD_SECTOR_SIZE;
}
TIMER_END();
TIMER_PRINT();
最佳答案
可能是因为没有缓冲直接写入。当您调用 fwrite
时,您正在执行缓冲写入,这在大多数情况下往往更快。本质上,每个 FILE*
处理程序都有一个内部缓冲区,当它变满时会定期刷新到磁盘,这意味着您最终会进行更少的系统调用,因为您只以较大的 block 写入磁盘。
换句话说,在您的第一个循环中,您实际上是在每次迭代期间将 SSD_SECTOR_SIZE 字节写入磁盘。在你的第二个循环中你不是。您只是将 SSD_SECTOR_SIZE 字节写入内存缓冲区,根据缓冲区的大小,它只会在每 N 次迭代时刷新一次。
关于c++ - 将原始数据写入驱动器或写入文件哪个更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1671986/