[.NET][vNext] .NET vNext @ 2014

.NET Framework 才剛宣佈 4.5.2 沒多久,隨即在 TechEd 2014 North America 上宣布 .NET Framework 的 vNext 版本,它也是 ASP.NET vNext 的核心,這次的 .NET vNext 倒不會看到在 BCL (Base Class Library) 上有多少改變,倒是為了配合微軟的新策略,大量引進 Open Source 的概念,將原本專屬於微軟的相關技術都開放,並且針對 Device 和 Cloud 的應用情境做專屬的最佳化,讓 .NET 在 Device 和 Cloud 都能獲得最佳表現,同時也讓 .NET 可以跨出 Windows 平台 (之前只有 Mono,微軟希望有更多的平台加入...

.NET Framework 才剛宣佈 4.5.2 沒多久,隨即在 TechEd 2014 North America 上宣布 .NET Framework 的 vNext 版本,它也是 ASP.NET vNext 的核心,這次的 .NET vNext 倒不會看到在 BCL (Base Class Library) 上有多少改變,倒是為了配合微軟的新策略,大量引進 Open Source 的概念,將原本專屬於微軟的相關技術都開放,並且針對 Device 和 Cloud 的應用情境做專屬的最佳化,讓 .NET 在 Device 和 Cloud 都能獲得最佳表現,同時也讓 .NET 可以跨出 Windows 平台 (之前只有 Mono,微軟希望有更多的平台加入)。

image

在這些 vNext 的功能中,由 .NET Compiler Platform 拔得頭籌。

.NET Compiler Platform (Roslyn)

這個開發代號為 Roslyn 的編譯器平台,是由一組編譯平台的 APIs 組成,除了具備編譯器本身的功能外,還具備像是 Code Analysis, Diagnostics 等與語言有關的 APIs,透過這個平台,非 Visual Studio 的 IDE 也可以獲得類似 Visual Studio 相等的程式碼分析與執行期的診斷能力,不用再像以前 .NET 相對封閉的 Compiler 一樣,難以獲得許多輔助開發的資訊。另外,Roslyn Compiler 是 Open Source 的編譯器,我們可以在 http://roslyn.codeplex.com/ 得到它的原始碼。

image

Roslyn  雖然名為 Compiler Platform,但是它把專案的結構都定義出來了,專案下分為文件 (原始碼或其他資源),文件下有程式碼 (文字與文法以及符號),同時可將多個方案整合起來,變成一個 Workspace,Workspace 本身可以輸出訊息給 IDE,整個 Workspace 運作於 Host Environment (例如 Visual Studio) 內,而獨立 IDE 的開發人員只要使用 Compiler Platform 的 API 層即可存取編譯器的功能,其他語言只要依照 Roslyn 所定義的 API 開發編譯器,就可以用在支援 Roslyn API 的 IDE 內,也就是說 ... Eclipse 只要利用 Roslyn API 的特性,就能輕鬆的存取 C# Compiler。

workspace-obj-relations.png

以往在 .NET Framework 裡面的 System.Runtime.CompilerServices 命名空間未來也預期會由 Roslyn API 替代,System.Reflection.Emit 命名空間內的 IL Generator 也會由 Compiler APIs 取代。

alex-api-layers.png

.NET Native

.NET Native 是未來即將取代 NGen (Native Generator) 的新機器語言產生器,.NET Native 是經過重新設計,針對 Device/Cloud 的需求設計開發的 Native Generator,它可以加快 MSIL 在 x64 機器上的執行效能,經過實驗測試,它可以比現有的 NGen 還快上 30~40%,記憶體卻可以更省。

image

若想要試用 .NET Native 的能力,必須要在 Windows 市集應用程式,並且選擇 x64 平台 (目前只支援 x64),然後在專案上按右鍵,才可以看到 Enable for .NET Native 的選項。

image

接著再到專案屬性中的建置選項,會看到使用 .NET 原生工具鏈編譯的核取方塊,將它打勾,就可以啟用 .NET Native Compiler 的編譯。

image

就我自己簡單的測試,有經過 .NET Native 編譯的程式的執行速度會比沒有用的要快 30% 左右,不過這沒有經過 Benchmark,只是簡單以讀秒方式來測的結果。有興趣的人可以到 http://msdn.microsoft.com/en-US/vstudio/dotnetnative 下載 .NET Native 來試試看,但 IDE 一定要是 VS 2013 Update 2 以上喔。

.NET RyuJIT

.NET Native 是針對很講究效能的 .NET 程式編譯成機器碼的編譯器,用它來編譯會比較久,而一般型的 .NET 應用程式 (包含 ASP.NET),就不是用 .NET Native 來編譯,仍然保持 JIT 編譯的方式,不過微軟開發了一個新的 JIT 提供者,稱為 RyuJIT。RyuJIT 的效能較現有的 JIT64 編譯器而言進步得相當快,根據微軟公布的效能比較,RyuJIT 在使用 RegEx 解析簡單 mail 的程式上就比 JIT64 快 21 倍,也比 NGen 產生的程式快上 1.4 倍,可見其優異的 JIT 執行效能。RyuJIT 目前只有提供 x64 版本,且只有 CTP4,若想體驗看看的人可以到 http://aka.ms/RyuJIT 下載安裝。

clip_image002[1]

SIMD 向量 (Vector)

image

SIMD (Single Instruction, Multiple Data) 是一種平行運算的方法,它的原理是讓一條指令可以同時處理多筆資料,並同時輸出多筆結果,而這些計算可以分散到不同的 CPU 去執行,這個方法可以加速迴圈型的運算,它可以將迴圈運算分散到不同的 CPU 進行平行處理,所以若是有大型迴圈運算的程式可以利用 SIMD 來加速,.NET Framework 的 SIMD 被封裝在 Microsoft.Bcl.Simd 組件內 (可由 NuGet 下載),它提供了 Vector<T> 類別,在此類別的實作中使用了 SIMD 進行迴圈運算,不過迴圈的寫法也要改一下。

image

RyuJIT 有某些部份也使用了 SIMD 作為加速處理之用,可見 SIMD 確實具有加速應用程式處理大量運算的功能。

 

Reference:

http://www.microsoft.com/net/netfuture