请教关于ReadFile和WriteFile的速度问题
2024-07-06社区
硬件/系统 帖子详情 请教关于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秒,请问这是什么原因?
...全文
1675 14 打赏 收藏 请教关于ReadFile和WriteFile的速度问题 如果只对一个文件用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++) { 复制链接
扫一扫 分享 转发到动态 举报 AI 作业
写回复 配置赞助广告取 消
确 定
用AI写文章 14 条回复 切换为时间正序 请发表友善的回复… 发表回复 打赏红包 需支付: 0.00 元 取 消 确 定 「已注销」 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之类的定位操作,所以不存在读写位置头重新定位的问题。 看不见的裂痕 2014-09-22 打赏举报 回复 你活的工作量就多了一倍。。加上读写位置头得重新定位。当然时间要久了。 赵4老师 2014-09-22 打赏举报 回复 以下→一下 赵4老师 2014-09-22 打赏举报 回复 恶补以下硬盘结构。 赵4老师 2014-09-22 打赏举报 回复 在文件大小相同的前提下:
读刚读过的文件比头次读没读过的文件快
读转速快的硬盘上的文件比读转速慢的硬盘上的文件快
读没有磁盘碎片的文件比读有磁盘碎片的文件快
读文件不处理比边读边处理快
单线程从头到尾一次读文件比多线程分别读文件各部分快(非固态硬盘上)
读固态硬盘上的文件比读普通硬盘上的文件快
写类似。 看不见的裂痕 2014-09-22 打赏举报 回复 加上读写位置头得重新定位。
解释下:读写位置要切换 shen_wei 2014-09-22 打赏举报 回复 还是一次写入更好,分那么多次写入。。你说哪。。 hhhh63 2014-09-22 打赏举报 回复 建个缓存,把数据准备好,一块读写,提高效率。 冒号老师谈Monad 关于monad实现I/O的问题,Haskell有专门的I/O库,包括readFile,writeFile,getChar,putChar等函数, 具体由编译器执行。在C#或F#中的情形我不太熟悉,相信原理是一样的。 至于monad,它是函数式编程中最抽象的... 求助:vue开发中,fs.readFile没有任何反应,也不报错,求救怎么解决 1、hello放在 fs.readFile之前能正常打印出hello,但放到 fs.readFile函数后边hello就不被打印出来,请教:怎么解决这个readFile的问题?(readFileSync一样的问题)这里打印输出:fs.redFile is not a function,... Monad Todd.log - a place to keep my thoughts on programming ...关于monad实现I/O的问题,Haskell有专门的I/O库,包括readFile,writeFile,getChar,putChar等函数, 具体由编译器执行。在C#或F#中 MFC: DeviceIoControl 通过API访问设备驱动程序 DeviceIoControl的其实和ReadFile和WriteFile是一样的, 不过这个功能更强, 一次交互能够输入数据, 也可以输出数据. DeviceIoControl内部创建的IRP是IRP_MJ_DEVICE_CONTROL类型的IRP, 然后操作系 c# 怎样监听已经打开的串口 要考虑api钩子,勾住createfile,readfile,writefile,KernelIoControl等相关的api,并自己重新封装数据,转发。
当然,如果只是想实现效果,你当然还有折中的办法,下载一个SerialNull软件,虚拟串口,这样你...
硬件/系统
2,644
社区成员
17,232
社区内容
发帖 与我相关 我的任务 硬件/系统 VC/MFC 硬件/系统 复制链接
扫一扫 分享 确定 社区描述 VC/MFC 硬件/系统 社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告 试试用AI创作助手写篇文章吧
+ 用AI写文章