2010-06-30 5 views
8

Ich habe eine Frage über Pufferverbrauch mit StreamReader. Hier: http://msdn.microsoft.com/en-us/library/system.io.streamreader.aspx Sie sehen können:StreamReader und Puffer in C#

„Wenn aus einem Stream zu lesen, ist es effizienter, einen Puffer zu verwenden, die die gleiche Größe wie der interne Puffer des Stroms ist.“.

Nach diesem weblog die interne Puffergröße eines Stream ist 2k, so kann ich effizient eine Datei von einigen kbs lesen Sie die Read() die Read(Char[], Int32, Int32) vermieden werden.

Außerdem, selbst wenn eine Datei kann ich die Stream groß ist eine Größe für die buffer

Also, was ist die Notwendigkeit eines externen Puffer konstruieren vorbei?

Antwort

1

Ich denke, diese Frage schon irgendwie anders auf Stackoverflow gefragt wurde: How to write the content of one stream into another stream in .net?

„Bei Verwendung der Read-Methode, ist es effizienter, einen Puffer zu verwenden, die die gleiche Größe wie der interne Puffer des Stroms ist, wo Der interne Puffer wird auf die gewünschte Blockgröße gesetzt und liest immer weniger als die Blockgröße. Wenn die Größe des internen Puffers beim Erstellen des Streams nicht angegeben wurde, beträgt seine Standardgröße 4 Kilobyte (4096 Byte). "

4

Mit Blick auf die Implementierung von StreamReader.Read Methoden können Sie sehen, beide rufen Sie interne ReadBuffer Methode.

Read() Die Methode wird zuerst in den internen Puffer eingelesen und dann nacheinander in den Puffer geschoben.

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[]...) ruft die ReadBuffer auch, aber stattdessen in den externen Puffer durch den Anrufer zur Verfügung gestellt:

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; 
    } 
}

Also ich denke, den Verlust nur die Leistung ist, dass Sie Read() viel mehr Zeit als Read(char[]) anrufen müssen und Da es sich um eine virtuelle Methode handelt, verlangsamen die Aufrufe selbst die Geschwindigkeit.