1

私は情報の検索と保存のコース プロジェクトを持っています。最初の部分では、ハード ディスクから大きなファイルを読み取るための最適なバッファー サイズを見つける必要があります。私たちの ta は、バッファ サイズを特定のポイント (通常は 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;
    }
4

2 に答える 2

2

私が知っているバッファリングは、並列非同期プロセスでのみ意味があります

いいえ!いいえ!バッファリングは多くの状況で意味があります。一般的な状況は I/O です。読み取り/書き込みバッファーのサイズを増やした場合。オペレーティング システムは、I/O デバイスに触れることが少なくなります。

また、各操作でより大きなブロックを読み書きできます。その後、パフォーマンスが向上します。

バッファ サイズを 128、512、1024 などから選択して2^nください。そうしないと、パフォーマンスが低下する可能性があります。

于 2013-03-10T17:18:59.813 に答える