2013-03-10 115 views
1

我有一个信息检索和存储课程项目,对于第一部分我必须找到从硬盘读取大文件的最佳缓冲区大小。我们的t.a说随着缓冲区大小增加到某个点(通常是4个字节),读取速度会增加,但在此之后它会下降。但是在下面的代码中,无论缓冲区大小还是文件大小(我已经在100 MB测试过),它都会增加。从我所知道的缓冲仅在并行异步进程(如线程)中才有意义,并且对文件进行碎片整理和/或查找文件目录和地址的代价(对于磁盘)是否足够重要,那么与我的代码相关的问题或者ifstream处理事物的方式或者这些条件不在此处?为什么缓冲速度随着缓冲区大小的增加而增加?

ifstream in("D:ISR\\Articles.dat", std::ifstream::binary); 

if(in) 
{ 
    in.seekg(0, in.end); 
    int length = in.tellg(); 

    length = 100 * 1024 * 1024; 
    int bufferSize = 2; 
    int blockSize = 1024;//1kB 
    int numberOfBlocks = length/blockSize; 
    if(length % blockSize > 0) numberOfBlocks++; 

    clock_t t; 
    double time; 

    for(int i = 0; i < 5; i++) 
    { 
     in.seekg(0, in.beg); 
     int position = 0; 
     int bufferPosition; 
     char* streamBuffer = new char[bufferSize]; 
     in.rdbuf()->pubsetbuf(streamBuffer, bufferSize); 

     t = clock(); 

     for(int i = 0; i < numberOfBlocks; i++) 
     { 
      char* buffer = new char[blockSize]; 
      bufferPosition = 0; 

      while(bufferPosition < blockSize && position < length) 
      { 
       in.read(buffer + bufferPosition, bufferSize); 
       position += bufferSize; 
       bufferPosition += bufferSize; 
      } 

      delete[] buffer; 
     } 

     t = clock() - t; 
     time = double(t)/CLOCKS_PER_SEC; 
     cout << "Buffer size : " << bufferSize << " -> Total time in seconds : " << time << "\n"; 

     bufferSize *= 2; 
    } 
+1

操作系统可能会将您在循环中读取的文件缓存到内存中,因此大多数电源都会进入I/O库函数。随着更大的缓冲区,你有更少的通话,因此性能提升。 – 2013-03-10 17:18:27

回答

2

我所知道的缓冲才有意义,在并行异步 过程

没有!没有!缓冲在许多情况下都有意义。常见的情况是I/O。如果增加读/写缓冲区的大小。操作系统可以少用I/O设备。

它可以在每个操作中读取/写入更大的块。然后,表现会变得更好。

2^n中选择缓冲区大小:128,512,1024,...否则会降低性能。

+0

谢谢,我忘记了访问I/O和I/O访问以及查找时间的系统调用。但我不明白为什么在某个缓冲区大小后性能会下降?! – TlifeProgram 2013-03-10 18:35:06

0

它只是增加了不管缓冲区大小或文件大小

上述说法并不成立。由于您反复测量程序,由于系统缓存的好处,后续结果会比以前的结果更好。实际上,您可以从系统缓存而不是硬盘访问文件内容。但是在缓冲器大小超过阈值之后,读取性能会下降。感谢理查德史蒂文在APUE 2nd的第3章,您可以找到详细和广泛的实验,读取&写入缓冲区。