StreamReader и буфер в C#

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

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

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

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

Таким образом, какова потребность внешнего буфера?

8
задан codingbadger 30 June 2010 в 09:56
поделиться

2 ответа

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

4
ответ дан 5 December 2019 в 23:13
поделиться

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

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

1
ответ дан 5 December 2019 в 23:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: