2010-06-30 32 views
8

Tôi có câu hỏi về việc sử dụng bộ đệm với StreamReader. đây: http://msdn.microsoft.com/en-us/library/system.io.streamreader.aspx bạn có thể thấy:StreamReader và bộ đệm trong C#

"Khi đọc từ một Stream, đó là hiệu quả hơn để sử dụng một bộ đệm đó là kích thước tương tự như bộ đệm bên trong của con suối.".

Theo weblog này, kích thước bộ đệm bên trong của một StreamReader là 2k, vì vậy tôi có hiệu quả có thể đọc một tập tin của một số kbs sử dụng Read() tránh Read(Char[], Int32, Int32).

Hơn nữa, ngay cả khi một tập tin là lớn, tôi có thể xây dựng các StreamReader đi qua một kích thước cho buffer

Vì vậy, nhu cầu của một bộ đệm bên ngoài là gì?

Trả lời

1

Tôi nghĩ rằng câu hỏi này đã được hỏi bằng cách nào đó khác nhau trên stackoverflow: How to write the content of one stream into another stream in .net?

"Khi sử dụng phương pháp đọc, đó là hiệu quả hơn để sử dụng một bộ đệm đó là kích thước tương tự như bộ đệm bên trong của con suối, nơi bộ đệm bên trong được đặt thành kích thước khối mong muốn của bạn và luôn đọc ít hơn kích thước khối. Nếu kích thước của bộ đệm bên trong không được chỉ định khi luồng được tạo, kích thước mặc định của nó là 4 kilobyte (4096 byte). "

4

Nhìn vào việc triển khai phương thức StreamReader.Read, bạn có thể thấy cả hai phương thức đều gọi phương thức nội bộ là ReadBuffer.

Read() phương pháp lần đầu tiên đọc vào bộ đệm bên trong, sau đó tiến hành lần lượt từng bộ đệm.

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[]...) gọi ReadBuffer quá, nhưng thay vì vào bộ đệm bên ngoài được cung cấp bởi người gọi:

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

Vì vậy, tôi đoán sự mất mát hiệu suất duy nhất là bạn cần phải gọi nhiều hơn nữa Read() lần so với Read(char[]) và vì nó là một phương pháp ảo, các cuộc gọi tự làm chậm nó xuống.

Các vấn đề liên quan