2010-06-30 24 views
8

StreamReader ile arabellek kullanımı hakkında bir sorum var. İşte : http://msdn.microsoft.com/en-us/library/system.io.streamreader.aspx görebilirsiniz:StreamReader ve arabellek C#

"bir akış alınan okurken, o akışın iç tampon olarak aynı boyutta bir tampon kullanmak daha verimlidir.".

bu weblog göre, bir StreamReader iç tampon boyutu 2k, bu yüzden verimli Read(Char[], Int32, Int32) kaçınarak Read() kullanarak bazı kbs bir dosyayı okuyabilir.

Üstelik bir dosya büyük olsa bile ben Yani harici tampon ihtiyacı ne buffer

için bir boyut geçen StreamReader inşa edebilir?

cevap

1

bu soru zaten stackoverflow bir şekilde farklı istendi düşünüyorum: How to write the content of one stream into another stream in .net?

"Okuma yöntemini kullanırken, akışın iç tampon, aynı boyutta bir tampon kullanmak daha verimlidir iç arabellek istediğiniz blok boyutuna ayarlanır ve her zaman blok boyutundan daha az okunur. Akış oluşturulduğunda iç arabellek boyutu belirtilmemişse, varsayılan boyutu 4 kilobayttır (4096 bayt).

4

StreamReader.Read yöntemlerinin uygulanmasına bakarak, bunların ikiside iç ReadBuffer yöntemini çağırabilirsiniz. Yöntem, ilk önce iç arabelleğe okur, sonra arabelleği birer birer ilerler.

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[]...) çok ReadBuffer çağırır, ancak bunun yerine arayan tarafından sağlanan dış tampon içine:

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

Yani sadece performans kaybını tahmin Eğer Read(char[]) ve daha Read() çok fazla kez çağırmanız gerekir olmasıdır Sanal bir yöntem olduğu için, aramalar kendilerini yavaşlatır.

İlgili konular