加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 05:41:54 所属栏目:百科 来源:网络整理
导读:我需要将数据写入驱动器.我有两个选择: 写入原始扇区(_ write(handle,pBuffer,size);) 写入一个文件(fwrite(pBuffer,size,count,pFile);) 哪种方式更快? 我预计原始部门的写作功能_write会更有效率.但是,我的测试结果失败了! fwrite更快. _write花费更长
我需要将数据写入驱动器.我有两个选择:

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读