C++的性能, C#的產(chǎn)能?!魚和熊掌可以兼得,.NET NATIVE初窺
對于微軟開發(fā)者來說,每次BUILD大會都是值得期待的。這次也是驚喜滿滿,除了大眾矚目的WP8.1的發(fā)布還有一項(xiàng)會令開發(fā)者興奮的技術(shù)出現(xiàn):.NET NATIVE。下面就來詳細(xì)了解一下其為何物。
[小九的學(xué)堂,致力于以平凡的語言描述不平凡的技術(shù)。如要轉(zhuǎn)載,請注明來源:小九的學(xué)堂。cnblogs.com/xfuture]
.Net當(dāng)初的出現(xiàn)是因?yàn)镴ava讓人了解到計(jì)算機(jī)發(fā)展的今天,語言的產(chǎn)能重要性是高于性能的。于是微軟便出了CLR和.Net。JIT(運(yùn)行時(shí)編譯)雖然消耗了性能,卻大大增加了產(chǎn)能。但是ObjectC又告訴了大家在平板和智能手機(jī)內(nèi)存和存儲受限的情況下,機(jī)器碼編譯性能是多么重要,而且也省電,這也很重要不是嗎。
微軟W8出現(xiàn)是平板時(shí)代應(yīng)運(yùn)而生的,于是便出現(xiàn)了開發(fā)時(shí)的產(chǎn)能,運(yùn)行時(shí)的性能的合體:.NET NATIVE。
.NET NATIVE目的是為了生產(chǎn)上的流水線產(chǎn)出的手工產(chǎn)品,易于開發(fā),運(yùn)行時(shí)精致。
.NET NATIVE之前被稱為Project N, 它可以把C#語言編譯成機(jī)器碼native code,使之可以像C++一樣運(yùn)行。其實(shí)這樣講比較籠統(tǒng),具體是在NATIVE里微軟重寫了.NET Framework,將程序所需要的framework里的元素加進(jìn)去而其他的則不用,生成可以運(yùn)行的機(jī)器碼,最終實(shí)現(xiàn)運(yùn)行時(shí)本地機(jī)器碼,不用動態(tài)編譯,節(jié)省了內(nèi)存和空間。
這其中有個誤區(qū),很多人認(rèn)為是.NET NATIVE把C#編譯成了C++,其實(shí)并不是,C++編譯器后端接受IL作為輸入,生成MDIL。
.NET NATIVE解決了很多.NET的問題,比如.NET運(yùn)行時(shí)計(jì)算,是消耗內(nèi)存和開銷更多電量,.NET NATIVE編譯時(shí)只有用到的才會靜態(tài)鏈接,其他部分就不要了,內(nèi)存中放入的只有框架的一部分,所以內(nèi)存占用很少,電量消耗也少,很適合平板等內(nèi)存相比較小的設(shè)備。
.Net native也實(shí)現(xiàn)了云編譯,開發(fā)者提供.NET代碼,而消費(fèi)者安裝的是自己設(shè)備可以使用的機(jī)器碼.
.Net native解決了.NET 版本管理的問題。開發(fā)中最常遇到這個東西.NET 低版本不支持,或者是要支持一些低版本機(jī)器,導(dǎo)致我們開發(fā)的環(huán)境一直是以低版本.net來進(jìn)行的。.net native編譯成機(jī)器碼就不存在這種問題了。個人認(rèn)為這個是其商業(yè)價(jià)值所在
據(jù)官網(wǎng),用native編譯的windows商店程序, 啟動速度加快60%,占用內(nèi)存減少將近20%。
現(xiàn)在.net native支持windows store apps,暫時(shí)不支持其他的一些.net桌面程序,WPF等。但我們可以期待以后會出現(xiàn)全盤都支持的時(shí)代。私人認(rèn)為WPF是難點(diǎn),畢竟是用了GPU。
安卓也有類似的,4.4出現(xiàn)了ART。希望有ART開發(fā)經(jīng)驗(yàn)的來一起研究進(jìn)行對比。http://www.pcpop.com/doc/0/967/967006.shtml
個人認(rèn)為出現(xiàn)的有點(diǎn)略晚,XP已經(jīng)下架了?,F(xiàn)在基本都是.net 3.5及以上了。還是以觀后效吧。
運(yùn)行時(shí)的截圖:
安裝:首先需要update2.大概3G(比2013還要大)。安裝OK后。安裝.net native 下面有鏈接。
.net native preview支持windowsstore 所以建立一個windowsstore的app:
然后右鍵點(diǎn)擊windowsstore項(xiàng)目,點(diǎn)擊 enable .net native
會彈出一個說明界面:
之后點(diǎn)擊Run static native analysis 會出現(xiàn)This application is compatible with .net native code generation。
位置在release folder下:
#p#
下面有不使用.net native后release folder大?。?/span>
使用.net native后。拿掉 說明.net native網(wǎng)頁文件夾后 可以部署的文件大?。?/p>
明顯編譯后還是小很多的。第一次使用,可能對其中文件和一些部署相關(guān)還不夠了解。有錯希望指正!。
之后會出更詳細(xì)的評測。希望大家持續(xù)關(guān)注謝謝!
假如還有問題,這個鏈接也許會解決您的疑惑:
http://msdn.microsoft.com/zh-cn/vstudio/dn642499.aspx
是否支持 F# 或 VB 或我最喜歡的語言?
此預(yù)覽版僅支持 C# 代碼,因?yàn)樗谴蠖鄶?shù)應(yīng)用商店應(yīng)用使用的 .NET 語言。但在我們拓寬工作重點(diǎn)之后,毫無疑問,我們會支持所有 .NET 語言。
此產(chǎn)品是僅與性能有關(guān),還是也允許生成針對 Win32/64 本機(jī)編譯并且不需要在目標(biāo)計(jì)算機(jī)上安裝 .NET Framework 的 C# 代碼(舉例來說)?
沒錯:.NET Native 不僅僅與性能有關(guān),而且與工作效率和一致的設(shè)備體驗(yàn)有關(guān)。利用 .NET Native,您能夠使用托管語言編寫代碼并且能夠像往常一樣上載 MSIL 包。但是,應(yīng)用將作為完全自包含的本機(jī)編譯代碼部署在最終用戶設(shè)備上(當(dāng) .NET Native 進(jìn)入生產(chǎn)時(shí)),并且不依賴目標(biāo)設(shè)備/計(jì)算機(jī)上的 .NET Framework。如您所知,.NET 應(yīng)用程序的范圍很廣。因此,我們對完整的 .NET Framework 也進(jìn)行了重大投入(例如,我們剛剛發(fā)布了 RyuJIT 的 CTP)。
設(shè)計(jì)此產(chǎn)品時(shí)考慮了哪些方案?
我們考慮過的方案是用于設(shè)備的應(yīng)用商店應(yīng)用 - 使開發(fā)人員能夠保持 .NET 和 MSIL 的工作效率優(yōu)勢并且能夠?qū)?MSIL 包上載到應(yīng)用商店,為最終用戶提供性能類似的本機(jī)代碼 (C++)(與 Windows Phone 8 類似,在云中進(jìn)行編譯)。
.NET Native 是否將取代 .NET Micro Framework 以及 C#/.NET 是否將完全可供小型設(shè)備使用?
.NET Native 當(dāng)前的重點(diǎn)是 Windows 應(yīng)用商店應(yīng)用。Micro Framework 由 Windows Embedded 團(tuán)隊(duì)交付,.NET 團(tuán)隊(duì)與他們一起攜手為客戶提供最佳服務(wù)。
開發(fā)人員預(yù)覽版是否適用于創(chuàng)建 Windows Phone 應(yīng)用和庫?
可以創(chuàng)建與 .NET Native 一起使用的通用類庫。在此預(yù)覽版中,僅 Windows 應(yīng)用商店應(yīng)用可使用 .NET Native 進(jìn)行創(chuàng)建。正在實(shí)現(xiàn)使用 .NET Native 開發(fā) Windows Phone 應(yīng)用。
此產(chǎn)品能否提高 C# 開發(fā)人員開發(fā)高度圖形化的應(yīng)用和/或游戲的體驗(yàn)?
可以。.NET Native 編譯器與 Microsoft C++ 優(yōu)化器共享部分基本代碼。
服務(wù)器/桌面應(yīng)用是否將受益于 .NET Native 和/或云中的編譯器?
桌面應(yīng)用是我們策略中的非常重要的部分。最初,我們的重心是 Windows 應(yīng)用商店應(yīng)用與 .NET Native。從長遠(yuǎn)來看,我們將繼續(xù)改進(jìn)所有 .NET 應(yīng)用程序的本機(jī)編譯。
如何進(jìn)行鏈接?框架代碼是否將編譯到應(yīng)用程序中?這將如何影響包/二進(jìn)制文件大???
是的,框架代碼將編譯到應(yīng)用程序中。對于包大小,由于大多數(shù)應(yīng)用商店應(yīng)用都有大量多媒體,因此差異不明顯。 因此,代碼大小確實(shí)會發(fā)生變化;但是,僅會將應(yīng)用使用的框架部分鏈接到應(yīng)用中。最終結(jié)果是,使用 .NET Native 編譯的二進(jìn)制文件將與執(zhí)行 NGEN 的二進(jìn)制文件處在相同的大小范圍中。 我們?nèi)詫⒀芯靠蛇M(jìn)一步減少大小差異的策略。
使用 .NET Native 編譯比使用 MSIL 編譯慢。為什么?
常規(guī)應(yīng)用開發(fā)使用 Visual Studio 中的標(biāo)準(zhǔn) MSIL/JIT 開發(fā)體驗(yàn)。只有在將應(yīng)用部署到設(shè)備才會調(diào)用 .NET Native 編譯器,在大多數(shù)開發(fā)過程完成之后,重心將轉(zhuǎn)移到應(yīng)用的優(yōu)化上。此時(shí),編譯時(shí)間與使用鏈接時(shí)間代碼生成優(yōu)化的 C++ 的差不多。
P/Invoke 有什么變化?是否會將它們優(yōu)化為標(biāo)準(zhǔn) DLL 調(diào)用?
即使對二進(jìn)制文件進(jìn)行本機(jī)編譯,但我們保留了托管代碼類型安全性(以及垃圾回收)和完整 C# 異常模型的好處。利用 .NET Native,我們還極大地優(yōu)化了互操作路徑 - 因此,盡管 P/Invoke 不會優(yōu)化為標(biāo)準(zhǔn) DLL 調(diào)用,但開銷極低,以便執(zhí)行 GC 同步和任何必需的封送。
有什么限制?此產(chǎn)品是否支持開放的泛型和反射?
.NET Native 將在進(jìn)入生產(chǎn)時(shí)支持目標(biāo)平臺支持的所有功能。由于這是預(yù)覽版,很多功能正在開發(fā)中,因此目前有一些限制。話雖如此,此預(yù)覽版中支持開放的泛型和反射(是的,甚至支持靜態(tài)編譯?。T诖祟A(yù)覽版中,編譯器具有試圖弄清運(yùn)行時(shí)需要的泛型實(shí)例化和元數(shù)據(jù)的內(nèi)置啟發(fā)機(jī)制。因此,大量的應(yīng)用有望直接運(yùn)行,而不必簡化源代碼來獲得編譯器的好處。
如何修補(bǔ)這些應(yīng)用或?yàn)檫@些應(yīng)用提供服務(wù)?
應(yīng)用的服務(wù)模式繼續(xù)保持不變。對于框架,.NET 的最新模式是自動提供庫更新。我們將繼續(xù)探索選項(xiàng);我們期待聽到您的建議和意見。
如果刪除了從未用過的方法,是否有某種方式表明某個方法(或整個類)已使用,即使從未直接調(diào)用過?
有;在此預(yù)覽版中,支持開發(fā)人員聲明某個方法(或類型)已使用,即使未直接調(diào)用(請查看運(yùn)行時(shí)指令文檔)。
下面附上一些.net native相關(guān)的鏈接:
http://social.msdn.microsoft.com/Forums/en-US/home?forum=dotnetnative
http://msdn.microsoft.com/en-US/vstudio/dotnetnative
http://blogs.msdn.com/b/dotnet/archive/2014/04/02/announcing-net-native-preview.aspx
http://channel9.msdn.com/Shows/Going+Deep/Inside-NET-Native
如果喜歡,請關(guān)注和推薦。謝謝光臨小九的學(xué)堂。