哪个更快,将原始数据写入驱动器,还是写入文件?

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

  1. 写入原始扇区(_ write(handle,pBuffer,size);)
  2. 写入文件(fwrite(pBuffer,size,count,pFile);)

哪种方式更快?

我期望原始部门的写作function_write更有效率。 但是,我的testing结果失败了! fwrite更快。 花费更长的时间。

我粘贴了一小段代码 也许我的代码是错误的。 你能帮我吗? 无论哪种方式是我可以,但我认为原始写更好,因为它似乎在驱动器中的数据至lessencryption….

#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(); 

在_write()情况下,SSD_SECTOR_SIZE的值很重要。 在fwrite的情况下,每个写的大小实际上是BUFSIZ。 要获得更好的比较,请确保底层缓冲区大小相同。

但是,这可能只是其中的一部分。

在fwrite的情况下,您正在测量将数据存入内存的速度。 您没有将stdio缓冲区刷新到操作系统,并且您没有要求操作系统将缓冲区刷新到物理存储。 为了更准确地比较,你应该在停止定时器之前调用fflush()。

如果您真的关心将数据存入磁盘而不是将数据存入操作系统缓冲区,则应确保在停止定时器之前调用fsync()/ FlushFileBuffers()。

其他明显的差异:

  • 驱动器是不同的。 我不知道有多不同。

  • 写入设备的语义不同于写入文件系统的语义; 文件系统被允许延迟写入以提高性能,直到明确地告诉不要(例如用标准句柄,调用FlushFileBuffers()); 直接写入设备不一定是这样优化的。 另一方面,文件系统必须执行额外的I / O来管理元数据(块分配,目录条目等)

我怀疑你看到的是有关事情实际上到达磁盘的速度的不同。 原始磁盘性能可能非常快,但是您需要大量写入操作,最好是多个并发的未完成操作。 您也可以在打开手柄时使用正确的选项避免缓冲区复制。

可能是因为直接写入没有被缓存。 当你调用fwrite ,你正在做缓冲写入,在大多数情况下往往会更快。 实际上,每个FILE*处理程序都有一个内部缓冲区,当它变满时,它会定期刷新到磁盘,这意味着您最终会减少系统调用,因为您只能以较大的块写入磁盘。

换句话说,在第一个循环中,实际上是在每次迭代过程中将SSD_SECTOR_SIZE字节写入磁盘。 在你的第二个循环中,你不是。 您只将SSD_SECTOR_SIZE个字节写入内存缓冲区,这取决于缓冲区的大小,只会在每第N次迭代时刷新一次。