У меня есть вопрос о буферном использовании с StreamReader. Здесь: http://msdn.microsoft.com/en-us/library/system.io.streamreader.aspx Вы видите:
"При чтении из Потока более эффективно использовать буфер, который является тем же размером как внутренний буфер потока"..
Согласно этому блогу, внутренний размер буфера StreamReader является 2k, таким образом, я могу эффективно считать файл некоторого использования kbs Read()
предотвращение Read(Char[], Int32, Int32)
.
Кроме того, даже если файл является большим, я могу создать StreamReader, передающий размер для буфера
Таким образом, какова потребность внешнего буфера?
Если посмотреть на реализацию методов 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[])
, а поскольку это виртуальный метод, сами вызовы замедляют его.
Я думаю, что этот вопрос уже как-то по-другому задавался в stackoverflow: Как записать содержимое одного потока в другой поток в .net?
«При использовании Read метод, более эффективно использовать буфер того же размера, что и внутренний буфер потока, где внутренний буфер установлен на желаемый размер блока, и всегда читать меньше, чем размер блока. внутренний буфер не был указан при создании потока, его размер по умолчанию составляет 4 килобайта (4096 байтов)."