为什么缓冲速度会随着ifstream中缓冲区大小的增加而增加?

时间:2013-03-10 17:12:32

标签: c++ ifstream

我有一个信息检索和存储课程项目,第一部分我必须找到从硬盘读取大文件的最佳缓冲区大小。我们的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;
    }

2 个答案:

答案 0 :(得分:2)

  

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

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

它可以在每个操作中读/写更大的块。然后,性能变得更好。

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

答案 1 :(得分:0)

  无论缓冲区大小或文件大小

,它都会增加

以上陈述不成立。由于您重复测量程序,由于系统缓存的好处,后续结果将优于以前的结果。实际上,您从系统缓存而不是硬盘访问文件内容。但是,在缓冲区大小超过阈值后,读取性能将降低。感谢Richard Steven在APUE 2nd中的第3章,您可以找到详细而广泛的阅读和阅读实验。写缓冲区。

相关问题