8

StreamReader でのバッファの使用について質問があります。ここ: http://msdn.microsoft.com/en-us/library/system.io.streamreader.aspxを見ることができます:

「ストリームから読み取るときは、ストリームの内部バッファーと同じサイズのバッファーを使用する方が効率的です。」.

このウェブログによると、StreamReader の内部バッファ サイズは 2kRead()ですRead(Char[], Int32, Int32)

さらに、ファイルが大きい場合でも、バッファのサイズを渡す StreamReader を構築できます

では、外部バッファの必要性は何ですか?

4

2 に答える 2

4

メソッドの実装をStreamReader.Read見ると、どちらも内部ReadBufferメソッドを呼び出していることがわかります。

Read()メソッドは最初に内部バッファに読み込み、次にバッファを 1 つずつ進めます。

public override int Read()
{
    if ((this.charPos == this.charLen) && (this.ReadBuffer() == 0))
    {
        return -1;
    }
    int num = this.charBuffer[this.charPos];
    this.charPos++;
    return num;
}

Read(char[]...)も呼び出しますReadBufferが、代わりに呼び出し元によって提供された外部バッファーに入れます。

public override int Read([In, Out] char[] buffer, int index, int count)
{
    while (count > 0)
    {
        ...
        num2 = this.ReadBuffer(buffer, index + num, count, out readToUserBuffer);
        ...
        count -= num2;
    }
}

Read()したがって、唯一のパフォーマンスの低下は、よりもはるかに多くの回数を呼び出す必要があることRead(char[])であり、それは仮想メソッドであるため、呼び出し自体が遅くなると思います。

于 2010-06-30T10:46:22.933 に答える
1

この質問は、stackoverflow ですでに別の方法で質問されていると思います: How to write the content of one stream into another stream in .net?

「Read メソッドを使用する場合は、ストリームの内部バッファーと同じサイズのバッファーを使用し、内部バッファーが目的のブロック サイズに設定されている場合に、常にブロック サイズよりも小さい値を読み取る方が効率的です。ストリームの構築時に内部バッファのサイズが指定されていなかった場合、デフォルトのサイズは 4 キロバイト (4096 バイト) です。」

于 2010-06-30T10:15:41.720 に答える