Chinaunix

标题: 关于C++中io缓冲的疑问 [打印本页]

作者: qiezhuifeng    时间: 2013-08-02 16:51
标题: 关于C++中io缓冲的疑问
最近写了一个程序涉及到缓冲读取,里面有这样的代码
  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++菜鸟,还请各位指点~
作者: hanxin83    时间: 2013-08-02 16:55
当然做过优化, 不过建议你还是自己缓冲, 现在内存都白菜价了, 一次全load进来, 慢慢读.
再不济mmap一下, 用指针随意读, 也是不错的.
作者: linux_c_py_php    时间: 2013-08-02 17:12
fstream有缓冲, 内核也有缓冲.
作者: qiezhuifeng    时间: 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做过缓冲的话,为什么结果会是这样的呢?
作者: linux_c_py_php    时间: 2013-08-02 18:30
4K读一次对内核最为友好.

估计你之所以慢是因为函数调用次数太多了.
作者: qiezhuifeng    时间: 2013-08-02 20:16
回复 5# linux_c_py_php


    我用函数调用模拟过类似的读取过程,发现函数调用的开销大约1秒左右,和真实的read成员每次一个字符的读取相比只有大约八分之一。
    不过确实有些收获,就是频繁调用的函数还是写成inline比较好,虽然编译器可能无法保证一定会对此进行优化。
作者: djsxut    时间: 2013-08-03 00:42
自定义buffer也可以,每次读取bufsize大小,根据需要返回合适的字节数。一定大小的bufsize以后区别不大,应该是跟文件系统的预读有关。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2