c++ - 将原始数据写入驱动器或写入文件哪个更快?

标签 c++ c windows

我需要将数据写入驱动器。我有两个选择:

  1. 写入原始扇区。(_write(handle, pBuffer, size);)
  2. 写入文件 (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/

相关文章:

c++ - 如何使用C++中的数组虚拟初始化方法读取文件

c++ - 我想开始 Qt 开发 - 我必须具备哪些 C++ 和操作系统的基础知识?

c++ - 模板的模板推导失败(中间有继承),有更好的方法吗?

c - free() 在 vi​​sual studio C 中卡住

c++ - 在 CodeBlocks 中的 Windows 8 上的 cygwin64 下使用 strptime

c - 解释一下下面的代码?

c++ - 格雷码加法

windows - 无法在 Windows/Cygwin 上使用 perl 确定文件创建时间

c++ - 如何在 Windows 内核中使用 std::map? STL端口?

windows - 写入 Windows 注册表?