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

前端之家收集整理的这篇文章主要介绍了c – 哪个更快,将原始数据写入驱动器或写入文件?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要将数据写入驱动器.我有两个选择:

>写入原始扇区(_ 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来管理元数据(块分配,目录条目等)

我怀疑你看到一个不同的政策,实际上有多快得到的磁盘.原始磁盘的性能可以非常快,但是您需要大量写入,最好是多个并发的未完成的操作.您也可以通过在打开句柄时使用正确的选项来避免缓冲区复制.

猜你在找的C&C++相关文章