簡體   English   中英

C#類型的安全性如何影響垃圾回收?

[英]How does c# type safety affect the garbage collection?

我正在處理可處理較大緩沖區(> 100MB)的代碼,並且對這些緩沖區的操作是在unsafe塊中完成的。 我想重構它們以避免unsafe代碼。 在開始之前,我想知道可能的內存性能提升(正/負/中性)。

我斷言,如果編譯器可以驗證類型,則可能會生成更好的代碼,這也意味着良好的GC性能。 這是有效的斷言嗎? 你有什么經驗? 謝謝。

這取決於您的緩沖區(用於)。

如此大的緩沖區將放置在大對象堆(LOH)上,因此請務必仔細閱讀有關后果。

充其量,我期望性能相同。

unsafe塊是一種語言功能,而不是CLR功能。 因此它們在運行時實際上並不存在。 在運行時確實存在固定變量,如果可以避免使用固定變量,則可能會獲得性能提升,但這取決於成本/收益之間的權衡。 因此,除非代碼沒有充分的理由將一個100 MB的緩沖區固定到內存中,否則不必擔心性能會受到影響。

我預計會產生負面影響。 除了消失“安全”標志之外,我看不到刪除不安全代碼的任何好處:

  1. 用常規的數組索引替換對數組的指針訪問(我想您正在使用那些指針?)會引入數組長度檢查->降低​​性能 同樣,在大多數情況下,指針算術運算-即使其速度不如本地語言所知-也是訪問數據(數組)的最快方法。

  2. 編譯器仍然“知道”類型,即使在不安全的塊中也是如此。 我看不出有任何機會制作“更好的”代碼。 同樣,即使“更好”的代碼也會導致創建更少的對象,這也只會影響GC的性能。 我懷疑編譯器是否可以避免創建新對象-只需知道它們的類型即可。 ->也沒有改善

  3. 上面已經說明了有關固定的論點。 擺脫固定的對象可能會稍微提高性能-但僅適用於小型對象。 不適用於駐留在(非壓縮)大對象堆上的大對象,因為它們無論如何都不會移動。 ->中性

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM