请教关于ReadFile和WriteFile的速度问题

LuoMuFeng 2014-09-21 02:28:49
如果只对一个文件用ReadFile或者只用WriteFile,则速度很快。如果二者都用,则很慢。代码如下:
char buf[32768];
void main()
{
HANDLE h=CreateFile("d:\\121.dat",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_NO_BUFFERING,NULL);
//以无缓存的方式打开一个文件

for(i=0;i<1024*1024*1024/32768;i++)
{//反复写入数据,每次写入32K,共写入1G
DWORD ac;
WriteFile(h,buf,32768,&ac,0);
}
}

以上程序运行完只需要15秒。
但是如果改为以下程序:
char buf[32768];
void main()
{
HANDLE h=CreateFile("d:\\121.dat",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_NO_BUFFERING,NULL);
//以无缓存的方式打开一个文件

for(i=0;i<1024*1024*1024/32768/2;i++)
{//边读边写数据,每次读写32K,读写加起来共1G
DWORD ac;
ReadFile(h,buf,32768,&ac,0);
WriteFile(h,buf,32768,&ac,0);
}
}

时间竟然需要50秒,请问这是什么原因?
...全文
1411 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2014-12-11
  • 打赏
  • 举报
回复
忽略主楼没有seek等等问题外,其实这真是windows的性能体现,windows就是这么慢。
fang 2014-12-11
  • 打赏
  • 举报
回复
1024*1024*1024/32768/2做成常数你这样搞循环一次要计算一次,DWORD ac移到循环外面,读写分开,预设一个适当大小的读缓冲(比方100M),再写,再循环读下一次读缓冲、写,直到结束。
fang 2014-12-11
  • 打赏
  • 举报
回复
1024*1024*1024/32768/2做成常数你这样搞循环一次要计算一次,DWORD ac移到循环外面,读写分开,预设一个适当大小的读缓冲(比方100M),再写,再循环读下一次读缓冲、写,直到结束。
fang 2014-12-11
  • 打赏
  • 举报
回复
1024*1024*1024/32768/2做成常数你这样搞循环一次要计算一次,DWORD ac移到循环外面,读写分开,预设一个适当大小的读缓冲(比方100M),再写,再循环读下一次读缓冲、写,直到结束。
Rockismej 2014-12-11
  • 打赏
  • 举报
回复
引用 5 楼 zhao4zhong1 的回复:
在文件大小相同的前提下: 读刚读过的文件比头次读没读过的文件快 读转速快的硬盘上的文件比读转速慢的硬盘上的文件快 读没有磁盘碎片的文件比读有磁盘碎片的文件快 读文件不处理比边读边处理快 单线程从头到尾一次读文件比多线程分别读文件各部分快(非固态硬盘上) 读固态硬盘上的文件比读普通硬盘上的文件快 写类似。
赵老师,学习了,多谢,呵呵
falloutmx 2014-10-14
  • 打赏
  • 举报
回复
引用 8 楼 LuoMuFeng 的回复:
好像不是这么回事啊。请大家注意看这两段程序,完全没有用到seek之类的定位操作,所以不存在读写位置头重新定位的问题。
建议补习下计算机体系结构,了解下内存和硬盘的映射关系
LuoMuFeng 2014-09-23
  • 打赏
  • 举报
回复
好像不是这么回事啊。请大家注意看这两段程序,完全没有用到seek之类的定位操作,所以不存在读写位置头重新定位的问题。
傻X 2014-09-22
  • 打赏
  • 举报
回复
你活的工作量就多了一倍。。加上读写位置头得重新定位。当然时间要久了。
赵4老师 2014-09-22
  • 打赏
  • 举报
回复
以下→一下
赵4老师 2014-09-22
  • 打赏
  • 举报
回复
恶补以下硬盘结构。
赵4老师 2014-09-22
  • 打赏
  • 举报
回复
在文件大小相同的前提下: 读刚读过的文件比头次读没读过的文件快 读转速快的硬盘上的文件比读转速慢的硬盘上的文件快 读没有磁盘碎片的文件比读有磁盘碎片的文件快 读文件不处理比边读边处理快 单线程从头到尾一次读文件比多线程分别读文件各部分快(非固态硬盘上) 读固态硬盘上的文件比读普通硬盘上的文件快 写类似。
傻X 2014-09-22
  • 打赏
  • 举报
回复
加上读写位置头得重新定位。 解释下:读写位置要切换
shen_wei 2014-09-22
  • 打赏
  • 举报
回复
还是一次写入更好,分那么多次写入。。你说哪。。
hhhh63 2014-09-22
  • 打赏
  • 举报
回复
建个缓存,把数据准备好,一块读写,提高效率。

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧