2011-05-19 68 views
1

我有以下方法,從套接字流複製字節磁盤:何時在堆棧上分配固定大小的數組?

public static void CopyStream(Stream input, Stream output) 
{ 
    // Insert null checking here for production 
    byte[] buffer = new byte[8192]; 
    int bytesRead; 
    while ((bytesRead = input.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     output.Write(buffer, 0, bytesRead); 
    } 
} 

我很好奇的是:將buffer堆棧或在 堆上分配?可以肯定的是,我可以使這種方法不安全,並將fixed關鍵字添加到 變量聲明中,但我不想這樣做,如果我不必這樣做。

+2

很確定它是從堆中分配的,但爲什麼要關心?如果有參考資料,GC不會影響內存... – seand 2011-05-19 02:30:50

+1

如果您希望將其分配到堆棧中,我無法看到「固定」對您有何幫助。當然,如果你希望它在堆棧上分配,恰當命名的「stackalloc」關鍵字是你想要的,而不是「固定的」。那就是說,爲什麼你要把這個分配到堆棧上? 8K有沒有關於堆棧寄存器的危險運動,你覺得比託管堆高水位安全移動8K更好? – 2011-05-19 06:48:39

+2

此外:你是否擔心分配的表現?你擔心它需要幾納秒才能完成分配,而不擔心數千或數百萬納秒的時間會將你正在寫入的巨大鐵盤旋轉到正確位置?在燃燒毫秒時,優化毫微秒毫無意義。 – 2011-05-19 07:21:03

回答

4

buffer變量將被分配在堆棧上,8192字節內存buffer變量保存位置將在堆上。爲什麼你在說fixed?你想加快速度嗎?它幾乎可以肯定不會......

引述埃裏克利珀:

「但是在絕大多數的程序 在那裏,本地變量分配 和釋放都不會是 性能瓶頸「。

Ref

+1

完全同意你的意見。先測量一下,這樣你就知道在哪裏以及在哪裏優化通常它會在I/O調用中花費很多時間。 – Mel 2011-05-19 02:42:44

相關問題