若是您是.NET性能的粉絲,最近有不少好消息,例如.NET Core 2.1中的性能改進和宣佈.NET Core 2.1,但咱們還有更多的好消息。分層編譯是一項重要的新特性功能,咱們能夠做爲預覽供任何人試用,從.NET Core 2.1開始。在咱們測試的許多場景中,應用程序啓動更快,而且在穩定狀態下運行得更快。一個在.NET Core 2.1上運行的項目,以及對環境變量或項目文件進行微不足道的更改以啓用它。在本文的其他部分,咱們將介紹它是什麼,如何使用它,以及爲何它是2.1版本的隱藏技能!git
從.NET Framework開始,代碼中的每一個方法一般都編譯一次。可是,在決定如何進行會影響應用程序性能的編譯時,須要進行權衡。例如,JIT能夠進行很是積極的優化並得到很好的穩定性能,可是優化代碼並非一件容易的事情,所以您的應用程序啓動速度很是慢。或者JIT可使用很是簡單的編譯算法,這些算法能夠快速運行,所以您的應用程序能夠快速啓動,但代碼質量會更差,而且應用程序吞吐量會受到影響。.NET一直試圖採用一種平衡的方法,在啓動和穩定性能方面作得很合理,但使用單一編譯意味着須要妥協。github
分層編譯功能經過容許運行時熱交換技術對.NET進行屢次編譯同一個方法改變了以上前提。兩套機制的分離以便咱們能夠選擇最適合啓動的技術,選擇最穩定狀態而且在二者上都表現出更好性能的第二種技術(分層編譯)。在.NET Core 2.1中,這就是Tiered Compilation旨在爲您的應用程序作的事情:算法
咱們將此做爲預覽版發佈的部分緣由是要了解它對您的應用程序的執行狀況,但如下是咱們對其進行測試的一些示例。雖然很是依賴於場景,但咱們但願這些結果是您在相似工做場景上的典型表明,而且隨着功能的成熟,結果將繼續改進。基準測試是在默認配置下運行的.NET Core 2.1 RTM,而且全部數字都通過縮放,所以基準始終爲1.0。在第一組中,咱們有幾個Tech Empower測試和MusicStore(用來專門測試的項目),這是咱們經常使用的ASP.NET應用示例。json
雖然咱們的一些ASP.NET基準測試得益於特別好(MvcPlaintext RPS超過60% - 哇!),但分層編譯並不特定於ASP.NET。如下是您在平常開發中可能遇到的一些示例.NET Core命令行應用程序:數據結構
你的應用程序將如何運做?測量比預測要容易得多,但咱們能夠提供一些普遍的經驗法則。app
一個小免責聲明,該功能仍然是一個預覽。咱們已對其進行了大量測試,但默認狀況下未啓用此功能,由於咱們但願收集反饋並繼續進行調整。打開它可能不會使你的應用程序更快,或者你可能遇到咱們沒有覆蓋到的地方。若是遇到問題,微軟隨時爲您提供幫助,您能夠隨時輕鬆將其禁用。若是您願意,能夠在生產中啓用此功能,但咱們強烈建議您事先進行測試。框架
有幾種方式能夠選擇加入此功能,全部這些方法都具備相同的效果:工具
此GitHub 連接可找到如下代碼性能
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>netcoreapp2.1</TargetFramework> <TieredCompilation>true</TieredCompilation> </PropertyGroup> </Project>
{ "runtimeOptions": { "configProperties": { "System.Runtime.TieredCompilation": true } }, "framework": { ... } }
COMPlus_TieredCompilation=1
有關嘗試和測量性能的更多詳細信息,請查看分層編譯演示測試
好奇它是如何工做的?不要懼怕,理解這些內部細節不是使用分層編譯所必需的,若是您願意,能夠跳過本節。一目瞭然,該功能可分爲四個不一樣的部分:
分層編譯創造了各類可能性,咱們能夠繼續充分利用將來的時間。既然運行時能夠利用更極端的狀況,那咱們就有了擴展邊界的動力,既能夠加快編譯速度,又能夠生成更高質量的代碼。經過代碼的運行時熱更新,.NET能夠進行更詳細的分析,而後使用運行時反饋來進行更好的優化(配置文件引導優化)。這些技術能夠容許代碼生成器甚至超出沒法訪問配置文件數據的最佳靜態優化器。或者還有其餘選項,例如用於更好診斷的動態去優化,用於減小內存使用的可收集代碼,以及用於性能檢測或服務的熱補丁。目前,咱們最直接的目標仍然接近實際 - 確保預覽中的功能運行良好,響應您的反饋,並完成工做的第一次迭代。
咱們但願Tiered Compilation爲您的應用程序提供與咱們的基準測試相同的重大改進,而且咱們知道還有更多還沒有開發的潛力。請試一試,而後訪問github,向咱們提供反饋,討論,提問,甚至能夠貢獻一些本身的代碼。謝謝!
原文:.NET Core 2.1中的分層編譯(預覽)