免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5297 | 回复: 6
打印 上一主题 下一主题

[C++] 关于C++中io缓冲的疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-08-02 16:51 |只看该作者 |倒序浏览
最近写了一个程序涉及到缓冲读取,里面有这样的代码
  1. while (xxxxxxx)
  2. {
  3.     if (aaaaa)
  4.         fin.read(&byte, 1);
  5.     else
  6.         fin.read(block, 1024);
  7. }
复制代码
后来我发现,当aaaaa这个条件总是命中的时候,文件处理的效率非常的低,我不知道c++是否做了相关的读取优化。
难道每次read的时候,都需要一次IO么?

如果是这样的话,是不是自己做缓冲比较好?还是说有什么其他的办法能够实现缓冲IO,实际上我的应用只需要顺序读取文件就可以了,并不会修改也不会反复的seekg。
C++菜鸟,还请各位指点~

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:032015年亚洲杯之中国
日期:2015-04-22 15:52:45
2 [报告]
发表于 2013-08-02 16:55 |只看该作者
当然做过优化, 不过建议你还是自己缓冲, 现在内存都白菜价了, 一次全load进来, 慢慢读.
再不济mmap一下, 用指针随意读, 也是不错的.

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
3 [报告]
发表于 2013-08-02 17:12 |只看该作者
fstream有缓冲, 内核也有缓冲.

论坛徽章:
0
4 [报告]
发表于 2013-08-02 18:18 |只看该作者
回复 2# hanxin83
  1. const int block_size = 2048;
  2.         char chars[block_size];

  3.         a = GetTickCount64();
  4.         while (fin)
  5.         {
  6.                 fin.read(chars, block_size);
  7.         }

  8.         b = GetTickCount64();

  9.         fin.close();
  10.         cout << b - a << endl;
复制代码
我用这段代码,为block_size赋不同的值,从1开始,到1024,发现读取的时间依次减少。一个40M左右的大文件,按照1字节读取的话需要8秒,等到按照1024字节,也就是1k读取的话,仅仅需要31ms,之后再提升也几乎提升不大了。如果fstream做过缓冲的话,为什么结果会是这样的呢?

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
5 [报告]
发表于 2013-08-02 18:30 |只看该作者
4K读一次对内核最为友好.

估计你之所以慢是因为函数调用次数太多了.

论坛徽章:
0
6 [报告]
发表于 2013-08-02 20:16 |只看该作者
回复 5# linux_c_py_php


    我用函数调用模拟过类似的读取过程,发现函数调用的开销大约1秒左右,和真实的read成员每次一个字符的读取相比只有大约八分之一。
    不过确实有些收获,就是频繁调用的函数还是写成inline比较好,虽然编译器可能无法保证一定会对此进行优化。

论坛徽章:
0
7 [报告]
发表于 2013-08-03 00:42 |只看该作者
自定义buffer也可以,每次读取bufsize大小,根据需要返回合适的字节数。一定大小的bufsize以后区别不大,应该是跟文件系统的预读有关。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP