我需要将数据写入驱动器.我有两个选择:
>写入原始扇区(_ 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();
解决方法
在_write()情况下,SSD_SECTOR_SIZE的值很重要.在fwrite情况下,每个写入的大小实际上是BUFSIZ.要获得更好的比较,请确保底层缓冲区大小相同.
但是,这可能只是其中的一部分.
在fwrite情况下,您正在测量可以将数据存入内存的速度.您尚未将stdio缓冲区刷新到操作系统,并且尚未要求操作系统将其缓冲区刷新到物理存储.要更准确地比较,您应该在停止计时器之前调用fflush().
如果您真的关心将数据存入磁盘,而不是仅将数据存入操作系统缓冲区,则应在确定计时器之前确保调用fsync()/ FlushFileBuffers().
其他明显差异:
>驱动器是不同的.我不知道有多不同.
>写入设备的语义与写入文件系统的语义不同;允许文件系统延迟写入以提高性能,直到明确告知不要(例如,使用标准句柄,调用FlushFileBuffers());直接写入设备不一定以这种方式进行优化.另一方面,文件系统必须执行额外的I / O来管理元数据(块分配,目录条目等)
我怀疑你看到一个不同的政策,实际上有多快得到的磁盘.原始磁盘的性能可以非常快,但是您需要大量写入,最好是多个并发的未完成的操作.您也可以通过在打开句柄时使用正确的选项来避免缓冲区复制.