廣州暨華電腦學校
咨詢熱線:020-85566216

誠        毅        精      勤

當前位置:所在位置: 廣州電腦培訓 >> 電腦技術 >> net >> 正文

.NET 4.6中的性能改進

發布時間:2018/2/26 11:54:46 內容來源::廣州暨華電腦學校 點擊:

  SIMD

  Mono團隊一直以他們對SIMD,即單指令流多數據流特性的支持引以為傲。SIMD是一種CPU指令集,它能夠在同一時間對最多8個值進行同一操作。而隨著.NET CLR版本4.6的推出,Windows開發者終于也能夠使用這一特性了。

  為了實際觀察一下SIMD的效果,可以參考一下這個示例。假設你需要通過c[i] = a[i] + b[i]這種形式對兩個數組進行相加,以得到第三個數組。通過使用SIMD,你可以按照以下方式編寫代碼:

  for (int i = 0; i < size; i += Vector.Count)

  {

  Vectorv = new Vector(A,i) + new Vector(B,i);

  v.CopyTo(C,i);

  }

  請注意這個循環是如何按Vector.Count的取值進行遞增的,根據CPU類型的不同,它的取值可能是4或是8。.NET JIT編譯器將根據CPU的不同生成相應的代碼,以4或8的值對數組進行批量相加。

  這種方式看起來有些繁瑣,因此微軟還提供了一系列輔助類,包括:

  Matrix3x2 結構

  Matrix4x4結構

  Plane結構

  Quaternion結構

  Vector 類

  Vector(T) 結構

  Vector2結構

  Vector3結構

  Vector4結構

  程序集卸載

  恐怕大多數開發者都不知道這一點:.NET經常會對同一個程序集加載兩次。發生這種情況的條件是.NET首先加載了某個程序集的IL版本,隨后又加載了同一程序集的NGEN版本(即預編譯版本)。這種方式對于物理內存來說是相當嚴重的浪費,尤其是對諸如Visual Studio這樣的大型32位應用程序來說更為明顯。

  而在.NET 4.6中,一旦CLR加載了某個程序集的NGEN版本,它會自動清空對應的IL版本所占用的內存。

  垃圾回收

  早先我們曾討論過.NET 4.0中所引入的垃圾回收滯后時間模式,雖然這種方式比起讓GC完全停止一段時間的做法要可靠許多,但對于許多GC場景來說,這種方式仍算不上完整。

  在.NET 4.6中,你將能夠通過一種更精密的方式臨時中止垃圾回收器的運作,新的TryStartNoGCRegion方法允許你指定在小對象以及大對象的堆中需要多少內存。

  如果出現內存不足的情況,運行時將會返回false,或是停止運行,直到通過GC清理得到足夠的內存為止。你可以通過為TryStartNoGCRegion傳入某個標記的方式控制這一行為,如果你成功地進入了某個無GC區域(在過程結束前不允許進行GC),那么在過程結束時必須調用EndNoGCRegion方法。

  在官方文檔中并沒有說明該方法是否是線程安全的,不過考慮到GC的工作原理,你應當盡量避免讓兩個進程同時嘗試改變GC狀態的做法。

  對于GC的另一項改進是它處理pinned對象(即一旦分配后不可移動位置的對象)的方式。雖然在文檔中對此方面的描述有些語焉不詳,但當你固定了某個對象的位置時,通常也會固定其相鄰對象的位置。Rich Lander在文中寫道:

  GC將以一種更優化的方式處理pinned對象,因此GC能夠將pinned對象周圍的內存進行更有效地壓縮。對于大量使用pin方式的大規模應用來說,這一改動將極大地改進應用的性能。

  GC對于如何使用較早的幾代中的內存方面也體現出更好的智能性,Rich繼續寫道:

  第1代對象升級為第2代對象的方式也得到了改進,以更有效地使用內存。在為某一代分配新的內存空間之前,GC會先嘗試使用可用的空間。同時,在利用可用空間區域創建對象時使用了新的算法,使新分配的空間大小比起從前更接近于對象的大小。

  異步本地存儲

  最后一項改進與性能并沒有直接的關系,但通過有效的利用仍然能達到優化的效果。在異步API還沒有流行起來的年代,開發者可以利用線程本地存儲(TLS)緩存信息。TLS對于某個特定的線程來說就像是一種全局對象,這意味著你可以直接訪問上下文信息并進行緩存,而無需顯式地傳遞某種上下文對象。

  而在async/await模式中,線程本地存儲就變得毫無用武之地了。因為每次調用await的時候,都有可能跳轉至另一個線程。而且即便僥幸避開了這種情況,但其它代碼也有可能跳轉到你的線程中并干擾TLS中的信息。

  新版本的.NET引入了異步本地存儲(ALS)機制以解決這一問題,ALS在語義上等價于線程本地存儲,但它能夠隨著await的調用進行相應的跳轉。這一功能將通過AsyncLocal泛型類實現,其內部將調用CallContext對象用于保存數據。

  • 上一篇電腦技術:
  • 下一篇電腦技術:
  • 學校簡介 |專業課程 | 學生就業 | 參觀學校

    學校地址:廣州天河區五山路金華園區C座3樓307(華南理工大學南門旁)

    學校名稱:廣州暨華電腦培訓學校 聯系電話:020-85566215

    2002-2019 廣州青大教育信息咨詢有限公司 版權所有 備案/許可證編號為:粵ICP備11083420號-11

    今天30选5开奖公告