StreamReader и буфер в C # - PullRequest
       57

StreamReader и буфер в C #

8 голосов
/ 30 июня 2010

У меня есть вопрос об использовании буфера с StreamReader.Здесь: http://msdn.microsoft.com/en-us/library/system.io.streamreader.aspx вы можете увидеть:

"При чтении из потока более эффективно использовать буфер того же размера, что и внутренний буфер потока.".

Согласно этому weblog , размер внутреннего буфера StreamReader равен 2k, поэтому я могу эффективно прочитать файл в несколько килобайт, используя Read(), избегая Read(Char[], Int32, Int32).

Более того, даже если файл большой, я могу создать StreamReader, передав размер буфера

Так зачем нужен внешний буфер?

Ответы [ 2 ]

4 голосов
/ 30 июня 2010

Рассматривая реализацию методов StreamReader.Read, вы видите, что они оба вызывают внутренний метод ReadBuffer.

Read() метод сначала читает во внутренний буфер, а затем перемещается в буфер один за другим.

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[]), и, поскольку это виртуальный метод, сами вызовы замедляют его.

1 голос
/ 30 июня 2010

Я думаю, что этот вопрос уже задавался как-то по-другому на stackoverflow: Как записать содержимое одного потока в другой поток в .net?

"При использовании метода Read онболее эффективно использовать буфер того же размера, что и внутренний буфер потока, где для внутреннего буфера задан желаемый размер блока, и всегда читать меньше размера блока. Если размер внутреннего буфера былне указан при создании потока, его размер по умолчанию составляет 4 килобайта (4096 байт). "

...