.NET的前世今生與將來
2018-09-15 08:13 靈感之源 閱讀(8240) 評論(89) 收藏 舉報筆者注
謹以此文紀念我敬重的2016年9月17日去世的 裝配腦袋 逝世兩周年
前言
.NET正式誕生了16年了,目前是微軟技術棧的主要開發平臺。筆者有幸在2002年在生產環境使用.NET 1.0 beta,一直到現在.NET Core 2.1,見證了.NET從最開始蹣跚學步的嬰兒,到現在在各大領域大放異彩的巨人。
在過去的10多年中,開始那些年,.NET被質疑、誤解,一些開技術人員覺得.NET就是Java的復制品,沒有什么值得學習和使用的,而且,一些反微軟陣營的技術人員,為了反對而反對。正是由于這些偏見,至今,一些公司仍然不愿意使用.NET,即便.NET從第一天開始就已經提交到ECMA標準和使用Rotor開放了代碼和免費使用。
本文試圖給大家展示一個完整的.NET歷史、現狀、生態圈,希望在.NET擁抱開源界的時候,業界也能擁抱.NET,更多技術人員參與到.NET的大家庭中來。
現在,讓我們一起回顧一下.NET過去10多年的發展吧。
.NET技術棧
誤解
-
.NET是封閉的
- 實際上,.NET從第一天開始便把標準提交到ECMA,并且利用Rotor 開放了源代碼(詳見這里),感謝RednaxelaFX的指正
-
.NET只能在Windows平臺上跑
- .NET 2004年開始就能在Linux上面跑了(Mono,詳見后面內容)
-
.NET帶來的費用高
- .NET是開源的,可以在多平臺跑,沒有費用可言
-
.NET性能低
- .NET(相關開發語言如C#)的性能在多個性能測試平臺上是領先的(詳見后面內容)
-
.NET是微軟的
-
這是典型的為了反而反,類似的幼稚行為是在微軟最近收購了GitHub后,一些開發人員馬上遷移到GitLab上,然而他們可能不知道:
- GitLab是在微軟Azure托管的(不過他們最近遷移到Google Cloud了)
- GItLab之前發生過因為主數據庫PostgreSQL備份/恢復出錯導致了客戶數據丟失的問題
-
前世
Windows 32
-
Visual C++
- 通用解決方案,可以是桌面應用(如MFC),也可以是C/S應用
-
Visual BASIC
- 快速應用開發(RAD)的一種,一般做圖形界面(GUI)應用
- 組件一般采用ActiveX(COM),利用注冊表做接口管理
- 提醒:VB在.NET沒有缺席
-
Delphi
- 另外一種RAD,兼顧了VB的組件化和VC++的很好的底層API交互支持
- Anders Hejlsberg是這個產品的首席架構師(提醒,他是.NET的核心人物之一,看下面內容)
- 標準Win32 DLL:要么隨意放到Windows System32目錄,要么Program Files (x86)目錄
- ActiveX DLL:雖然統一用注冊表做版本信息管理,但是因為發布的時候版本沒定義好,導致使用regsvr32.exe注冊的時候可能會把上一個版本覆蓋
前期
背景
誕生
微軟劍橋研究院的技術人員,在1998年開始研究下一代的開發技術,他們的思維很超前,去年他們發了一篇文章,介紹這個項目的發展史,上面的圖片,清晰可見一些.NET的特性,還有一些還沒有被實現。
.NET這個開發平臺,學習多個開發平臺的特性,譬如Java,把開發語言Java等(筆者注:別的Java平臺語言下面提及)編譯成中間語言(IL),運行時JIT。不過.NET更進一步,支持本地化編譯。
2002年,微軟正式對外發布了.NET 1.0。
最近,Oracle宣稱.NET的主要對手Java的安裝量超過20億,筆者還沒有找到.NET安裝量的官方數字。
.NET的名字
.NET特性
首先,.NET是一個開發平臺,從1.0開始支持GUI(WinForm)、CUI(控制臺)、Windows Service、Remoting等等Windows平臺的開發,也支持ASP.NET (WebForm)開發web系統,所以從最開始,.NET就支持多平臺開發??梢哉f.NET從第一天開始便是為了互聯網而生的。
.NET編譯生產的文件叫程序集Assembly,就是代碼物理的集合,命名空間用來邏輯歸類代碼。
語言 vs 平臺
-
平臺:.NET
- 語言:C#,F#,VB.NET,等等
-
平臺:JVM
- 語言:Java、Scala、Clojure,等等
- 編譯成中間語言(IL)
- 運行時即使編譯成machine code(JIT,后述)
- 有辦法改變JIT的行為(調優)
- 有辦法預編譯成machine code
言歸正傳,.NET平臺上最主流的3種開發語言分別是C#、VB.NET和F#。
Pascal之父、Delphi首席架構師Anders Hejlsberg,當年還在Borland,被微軟CEO Bill Gates重金邀請加盟微軟,主導開發.NET平臺上的全新開發語言,這就有了現在.NET平臺上最流行的開發語言C# ,取義C++的++ ,即(C++)++,合在一起就是4個+,碰巧和音符的C?一樣,所以讀作C sharp,不是C井,謝謝。因為這個升C的字符比較難敲,所以,一般用數字3上面的那個#符合代替(對,?和#不是同一個字符)。C#是目前全球最流行的開發語言之一。
如果你想深入了解C#,可以參考Jon Skeet編寫的《C# in depth》,JK很奇怪,他是在Stack Overflow上是排名第一的回答者,C#專家,然而,他卻是在Google工作的(潛伏的臥底?)。
筆者對BASIC有著非常深厚的感情,第一次接觸這個語言是1992/1993年的時候,后來用了GWBASIC、TrueBASIC、TurboBASIC、QBASIC、QuickBASIC、Visual BASIC (1.0版本還是DOS下的,用的ASCII字符拼接成圖形界面)。
如果你用Visual BASIC 5/6,相信不會對VB.NET太陌生,盡管VB.NET用起來有點別扭。VB.NET表面上是微軟照顧老VB用戶在.NET平臺上的實現,但這個語言實在太別扭。在VB 11.0之前,它是盡量和C#高度交互的,很多語言特性都盡量“兼容”,但是11.0之后,開發團隊決定和C#分道揚鑣,各自演進。
說起VB.NET,相信一些開發人員還記得@裝配腦袋,他從老VB開始就是忠實用戶,在博客、技術會議中和大家分享各自VB.NET/編譯器技術和心得,他兩年前不幸因病去世,愿天堂沒有bug。
VC++一直以開發高性能著稱程序,在.NET世界,VC++.NET,可以和.NET程序集交互,當然,你仍然可以選擇寫不基于.NET的代碼。不過,如果你用,NET的話,為什么不直接用C#?除了VC++.NET,微軟還有C++/CLI這個專門設計來和.NETA交互的兼容C++的語言,用來開發.NET托管代碼。
如果你需要高性能、喜歡函數式編程,那么F#這個函數式的開發語言會比較適合你,它天生以高性能并行計算著稱??赡苣氵€已經猜到,F#里的F代表Functional函數式。
微軟當年雄心勃勃,希望把.NET打造為大一統的開發平臺,當年Java如日中天,微軟自然不會放過這個機會:難道還有直接把對手的支持者拉攏過來的而擴大市場更好的辦法嗎?此消彼長,道理大家都懂。所以微軟推出了J#。不過這個項目有點尷尬,最開始是想和Java進行交互,利用Java成熟的平臺組件,后來項目沒有被維護了,但是,.NET 4.5之前,想要自己讀寫zip文件,.NET框架內置的類庫中,只有J#有一個類庫,否則只能用第三方的方案。
J#出師未捷身先死,長使英雄淚滿襟。然而這并沒有阻止.NET的雄心。大家知道JVM是一個運行平臺,在這基礎上,有各種語言,Java是老大哥,Scala有取而代之的趨勢,最近Google因為不滿Oracle拿Java版權大棒亂揮舞,近年大力扶植JetBrains的Kotlin。同樣,.NET平臺上,也有多種語言,除了上述的幾種,還有Fantom、Visual COBOL、ClojureCLR等。
為了和動態語言交互,.NET引入了 Dynamic Language Runtime (DLR),這樣,各自動態語言就可以和.NET互相調用,而這個平臺下的語言一般有一個前綴:Iron。當年出現了IronPython、IronRuby、IronScheme等項目。然而,這個項目沒有被維護了?;蛟SIron是因為這個名字起得比較晦氣,都“打鐵”了。
核心特性
每種語言/開發平臺都有自己的看家本領:語言特性(面向對象 vs 函數式、強類型 vs 動態類型、并行計算等等)、生態圈(開放、大量的第三方庫/擴展支持)等等。
.NET的運行時Common Language Runtime(CLR)是.NET的核心,負責程序的解釋和運行。.NET程序啟動的時候,會經過多達50步才正式開始跑你寫的第一行代碼,中間是各種元數據的查找、分析等。如果程序是第一次執行,CLR會把要執行的代碼路徑進行JIT(即時編譯),這個過程會有各種優化,舉個例子:冷代碼(如異常處理邏輯)會相對熱代碼(正常邏輯)執行較慢,這就是為什么如果過度使用異常來做控制,會有性能瓶頸。
如果你想對CLR進入深入的了解,可以參考傳奇開發人員Jeffrey Richter編寫的《CLR via C#》,他是經典開發書籍《Windows via C/C++ 》的作者。
.NET大量封裝Win 32 API,這叫InterOperability(InterOp)。如果你需要調用第三方甚至自己編寫的Windows 32,可以通過這個實現。
還記得DLL地獄嗎?.NET的程序集經過SN(強命名)簽名后,可以通過gacutil注冊到Global Assembly Cache(GAC),這樣任何一個程序可以直接調用。因為它通過程序集名稱(assembly name)來區分每個程序集的唯一性,所以不會出現不同版本的程序集互相覆蓋的問題。
C/C++,沒有第三方的庫,你需要手工控制內存的調用和回收,好處是按需調用,省內存,高效,然而對開發人員有較高要求,所以一般使用第三方的解決方案。Java和.NET,都有自己的
Garbage Collection (GC)。.NET GC分3個階段,不同階段針對對象的不同生命周期。如果你希望深入研究GC,可以參考下面的"高性能"部分。
不同于現在各種基于Google Chromium二次打包的瀏覽器殼,除了完整版,.NET還包括多個不同的兄弟框架,譬如.NET Execution Environment (DNX)、Compact Framework (CF)用于移動設備、Microsoft Framework (MF)用于嵌入式設備。
開發
Visual Studio是最受微軟技術開發人員歡迎的IDE,你可以通過它使用上述各種語言開發、調試、測試、發布各種應用?;蛟S你不知道,Visual Studio作為通用的IDE,被其它產品借用,譬如微軟SQL Server的管理工具SQL Server Management Studio (SSMS)就是基于Visual Studio的,所以大部分快捷鍵和功能是一致的。
剛開始的時候微軟推出的.NET針對自家Windows桌面開發推出了Windows Form(WinForm)這個開發方案。出發點是想把所有界面元素OO化,通過事件驅動,底層還是Win32那套消息機制,GDI+渲染。不過默認的渲染效果有審美疲勞,所以有些應用采用了國內比較流行的皮膚做法,通過owner draw實現自主的渲染,擺脫了單一的UX體驗。
不喜歡WinForm的事件模型?不喜歡自己實現雙向綁定?不喜歡WinForm太傳統的Win32 GUI元素?那么,WPF應該會是你的選擇。它使用XAML作為界面語言,DirectX渲染,邏輯代碼可以選擇C#或者VB.NET。之所以使用XAML(XML格式),是為了把界面描述標準化,這是iOS、Android和Xamarin的標準做法。
.NET的推出是為了應對互聯網時代,必不可少的,需要提供網站開發方案。微軟把當年的基于ActiveX + VBScript的服務器端開發解決方案ASP(Active Server Pages)升級,成為了ASP.NET。WebForm的設計思想是復制WinForm,但是封裝得不好,導致用戶被迫強行做各種js和css hack,尤其是它復制WinForm的事件模型,導致各自不必要的Postback,而且頁面有著極其臃腫的ViewState來維護當前的狀態,所以很多時候頁面加載耗時甚長,久等不見內容。當然你可以用UpdatePanel做異步ajax更新提升用戶體驗。
- 早年的封裝沒有考慮各個瀏覽器的兼容性,開發者必須做各種js/css hack
- 表格postback設計導致不理想的用戶體驗
- 使用ViewState做當前頁面的狀態保持,但這個ViewState是寫入到頁面的,默認是寫入到文件前面部分,但頁面數據量多的時候(如使用DataGrid),這個ViewState會相當大,導致頁面加載緩慢,雖然有辦法把ViewState放到頁面后面部分,讓加載看起來快點,但是根本問題沒有解決。而且ViewState會出現各種損壞的情況導致功能無法使用
- 容易導致開發人員把界面、業務邏輯和數據存儲都放到同一個文件里面,難以維護和做單元測試
- 慢,慢,慢,重要的事情要說三遍
你可能會問,那到底用什么做頁面渲染?簡單來說:不要在服務器端做渲染,因為所有界面渲染都不應該是服務器的事情,現在用戶的瀏覽器渲染能力很強,這種事情完全應該留給客戶的機器去做,這樣服務器的壓力會大減。服務器應該做的事情只是接受請求,根據業務邏輯處理數據、讀取/存儲數據。
所以,頁面渲染,應該選擇成熟Web前端MVC方案,譬如AngularJS、React等。
網絡開發,除了網站,還有一些不可見的后臺服務。Web Services是跟隨ASP.NET 1.0推出的,協議基于XML,現在使用這個技術的產品比較少了。后來微軟推出了大一統的WCF(Windows Communication Foundation)平臺,是相對較新的一套Web服務解決方案,支持多種傳輸協議和安全機制,但配置繁瑣。
ASP.NET Web API是ASP.NET MVC的一個組件,提供構建RESTful API的方案,目前比較多產品使用。
大家還記得Java Applet嗎?當年Flash大行其道,但其問題太多,安全問題、CPU占用問題、穩定性等等。為了對抗如日中天的Flash,微軟推出了Silverlight。Silverlight的性能不亞于Flash,而且比隔三差五要打安全補丁的Flash安全很多,但是兩者都無法擺脫基于ActiveX插件的問題,即便預先安裝,也常有版本兼容問題導致無法在瀏覽器加載,而且默認那套銀灰色的界面確實有審美問題。
- 當年奧運會MSNBC的網絡直播采用Silverlight解決方案
- 微軟的本地虛擬機管理平臺Windows Controller,用的就是Silverlight
- 微軟云平臺Azure,早期版本,使用了Silverlight做界面
不過和Flash抵擋不了技術發展的洪流一樣,Silverlight也被迫退出了市場。對了,Flash在中國還是奇葩地存在,由某個流氓公司特供中國版,切記不要使用。
一個成熟的開發平臺,單純有好的語言、基礎庫還是不足夠的。當年為了方便開發人員,微軟提供了一整套的常用功能框架,叫Enterprise Library,包括功能如讀寫配置、數據訪問、日志、緩存等,而這個項目的前身是Best Practice Application Blocks,就是類似廣大開發愛好者常常自己搞的工具庫。
大家還記得ActiveX年代的ADODB嗎?在.NET世界,我們有升級版:ADO.NET。通過ADO.NET,你可以訪問各大數據庫系統。大部分數據庫系統是支持多線程的,所以需要讀寫數據的時候:
- 當你單線程讀寫數據的時候,已經用了command.Prepare(),甚至在允許表鎖定的情況下用了connection.BeginTransaction()還是覺得慢,那么,
- 可以用多線程,這里可以Parallel下的方法,一般多線程下會快帶來幾倍的性能提升,如果你還是覺得慢,那么,
- 使用bulk copy。一般大型數據庫系統都提供這個,譬如SQL Server提供SqlBulkCopy(本質上是BULK INSERT),譬如PostgreSQL提供的COPY命令
隨著技術的發展,面向對象進入數據存儲和訪問領域。譬如數據訪問,這些解決方案叫O/RM,對象關系映射。在Java領域著名的Hibernate被移植到.NET成了NHibernate,Dapper也是一個不錯的輕量級的選擇。微軟也推出了自己的Entity Framework,后來并開源了。
不過不管是Code First、Model First還是Database First,這些OO化的O/RM,因為對象化這個過程,性能損耗不可避免,而且,不同的解決方案要么解決不了延遲加載,要么做不好緩存,或者動態生成的SQL效率低下。如果你需要絕對的高性能,還是應該手工寫SQL,并且封裝到存儲過程,這樣業務邏輯不需要在每次執行的時候都在客戶端/服務器不斷傳輸。想象一下,即便某業務邏輯執行速度很快,但數量巨大,譬如一天100萬次,當這個業務邏輯很復雜,譬如100K,那么一天光是這些SQL的網絡流量起碼是100GB,如果如果是封裝成SP,那么,可能就是100MB。
同時,使用這些O/RM,一般會遇到對具體某種RDBMS的特性支持不好的情況,需要使用底層SQL直接調用操作,這樣O/RM就無法直接切換到別的數據庫系統了。
NoSQL蓬勃發展,在傳統關系型數據庫系統中被常規化的數據(一條數據會被存儲到不同的字段甚至不同的表),現在作為一個json文件(字符串)被存儲到各種類型的NoSQL中。NoSQL優勢是快速的讀寫,因為避免了多表關聯的可能,一次讀取,一次寫入。但是真因為這樣,絕大部分NoSQL無法做跨表(集合)的關聯,因此一般的做法是用定時任務生成目標數據,這種解決方案有2個問題:數據非實時和冗余的空間占用,同時,json文件本身的所有屬性是鍵值對,所以空間占用遠遜于RDBMS。
市面上不乏基于.NET的NoSQL,部分還是開源的,筆者覺得最好的一個是開源的STSDb,獨創的Waterfall索引比傳統的b+樹要跟高性能。
大量業務系統都需要用到工作流。WF(Windows Workflow)是微軟額外推出的基于.NET的工作流系統,不過這個方案配置起來有點羅嗦。
生態圈
從別的成熟平臺中移植著名的項目是業界慣常的做法。一些著名/優秀的項目被移植到.NET,譬如Java世界的hibernate (nhibernate)、junit (nunit)、iText (iTextSharp)、Quartz (Quartz.net)、Lucence (Lucence.net)、Log4j (log4net)。
一個開放平臺的成熟,離不開社區的支持。開源/代碼托管網站,早期的有SourceForge.net、CodeProject等,后來微軟自己推出了自己的GotDotNet,后來變成了CodePlex.com,然而幾個月前這個項目已經停止運轉,大部分項目都被作者各自遷移到GitHub。
.NET框架和C#從第一天開始,就作為ECMA標準公開了源代碼,這為后來的Mono和跨平臺打下了堅實的基礎。幾年前,微軟把.NET完全開源了,包括編譯器、框架、類庫等等。
著名的Linux GUI解決方案GNOME之父Miguel de Icaza,創建了Mono項目,讓.NET真正跨平臺,在Linux、MacOS下運行。Mono項目同時帶來了SharpDevelop這個IDE,后來又被移植到別的平臺上成為了MonoDevelop。
Mono項目近年被Ubuntu擁抱,跟隨標準發布預裝。
今生
.NET的發展腳步沒有停下來,它不斷進化,現在,.NET已經在各大平臺扎根。
最近的15年周年紀念活動,Anders Hejlsberg被Channel 9邀請參與活動,并講述了他對C#的看法,他表示:“我也沒想到C#能如此興盛。”
如果說.NET平臺是心臟,那么,語言就是骨絡。目前.NET平臺上3大主流開發語言有各自的演進路線。C#作為先鋒在新特性上不斷快速進化,譬如LINQ/Lambda、async/await并行計算等,當然動態特性也是值得提及的。如果一個東西走起來像鴨子,叫起來像鴨子,它可能不是一只鴨子而是被鴨子帶壞了的鸚鵡。如果你想知道C#的各種技術內幕,可以看Matt Warren的技術博客,他是C#語言委員會的成員之一,這個委員會決定每個版本的新特性。
Roslyn作為新一代的編譯工具,使用C#編寫,終于實現了.NET的自舉,這是一個語言成熟的標志。
開發工具
不僅僅是各種語言跨平臺,微軟的開發工具也能跨平臺。Windows上最佳開發IDE Visual Studio現在不僅僅在Windows上跑,微軟推出的兄弟Visual Studio Code還支持Linux和MacOS,還有Visual Studio For Mac。
相信做過開發的同學都對各種第三方依賴組件的引入、維護都很煩惱,NPM、webpack、Chocolatey、Maven Repository等都是著名的包管理解決方案,微軟效仿之,推出了NuGet。本質上NuGet包和Office系列的文件類似,都是zip文件,里面有一些元信息和實際文件。通過Visual Studio的項目Package菜單你可以直接生成NuGet包。早期的NuGet不允許直接下載包,非常惱人,必須通過客戶端如Visual Studio,現在允許了。
如果你想架設自己的NuGet包管理平臺,可以使用ProGet。
案例
或許你會想,.NET到底有什么優秀的案例?
如果你做Web開發,相信你聽過甚至用過OWIN項目,它包括了SignalR、Nancy、Katana等項目。如果你用過IoC,你應該聽過甚至用過Windsor,它是Castle項目的一員,包括了ActiveRecord、MonoRail等。相信你用過stackoverflow?它以及眾多兄弟網站,都屬于StackExchange,而這些所有網站都是基于ASP.NET的。微軟自家一些產品也是完全或者部分使用.NET實現的,譬如BizTalk、Blend等。
如果你想了解更多的優秀.NET解決方案,可以看這個非常詳細的列表:https://github.com/Microsoft/dotnet/blob/master/dotnet-developer-projects.md
了解或者開發過云應用嗎?業界領先的公有云提供商微軟Azure,這個平臺大部分技術都是基于.NET的。對了,Bing搜索引擎也是。
Unity是流行的2D/3D游戲開發平臺,其腳本系統主要是Mono,它剛剛對外宣布支持最新版版本Mono。另外一個游戲引擎Godot,也是使用Mono作為腳本引擎。
有些技術牛人,利用.NET打造自己的開源的操作系統。譬如比較早期的Cosmos OS ( https://www.gocosmos.org/ ),還有近期的FlingOS( http://www.flingos.co.uk/ )。由此可見.NET作為一個開發平臺的能力和潛力。
為了實現跨CPU平臺(x86和ARM等),微軟為 Windows帶來了UWP,開發者可以使用多種開發語言(.NET家族的,甚至HTML/WinJS)開發Windows平臺應用,界面語言是XAML,這些應用不僅僅可以在Intel的x86平臺下跑,還可以在ARM上跑。大家還記得Windows Phone和Surface嗎?
跨平臺
之前說過Mono這個跨平臺開發解決方案,在支持Linux/MacOS的基礎上,它繼續進化,衍生出Xamarin項目,實現了對主流手機系統蘋果iOS、Google Android、微軟WP甚至三星Tizen的支持。
2016年微軟收購了Xamarin,整合到Visual Studio里,并且將其開源,創始人Miguel de Icaza成為微軟的Distinguished Engineer。
DotNet Anywhere (DNA)是另外一套跨平臺解決方案:https://github.com/chrisdunelm/DotNetAnywhere
2016年,微軟為了大一統.NET平臺標準,推出了.NET Standard,可以把這個看成一個協議,而不是具體實現。具體實現是.NET完整版 4.x、.NET Core 2.x、Xamarin等。
.NET完整版4.x現在統治Windows平臺,Xamarin復制移動平臺,而.NET Core則主打跨平臺,如Linux、MacOS、Docker、嵌入式設備、IoT等,譬如已經有Raspberry Pi等設備在運行.NET Core?;蛟S你不知道,Docker For Windows是用.NET編寫的。
.NET Core做法和.NET完整版在API層面基本上一直和兼容,區別在于,.NET完整版是依賴本地GAC安裝/本地目錄的.NET程序集,而.NET Core是依賴NuGet包,所有基礎類庫都是NuGet包,而這些包不像老版本的node.js那樣都安裝到本地目錄,而是集中安裝到本機的NuGet庫里。
和.NET Core匹配的有ASP.NET Core,允許開發人員開發在Linux等平臺跑的Web系統。
.NET開發初期,大量借鑒Java這個平臺的優點,近年,Java作為平臺和作為語言,分別復制了,NET和C#的一些特性。JavaScript的一些新特性直接復制了C#的特性。
高性能
業界做性能測試的時候,一般會用這句話:“不服跑個分!”。網上有各種性能評測文章/比較網站,最近看過一個完整,各種語言互相比較,其中.NET和Java的結果差異不大,11個比較項目中,.NET 6 : 5 Java。
.NET為了提高性能,通過如下幾個不同狀態下方式:
- 語言:支持Parallel等并行計算
- 編譯:編譯器會做各種優化,譬如代碼內聯,像常量和枚舉等,會直接把實際值復制到調用方
- JIT:除了根據代碼訪問路徑進行動態即使編譯之外,還可以使用更可控的Profile Guided JIT
- 本地化:可以使用多種方式進行本地化編譯,譬如ngen命令行和C# Native
- LLVM:有一個開源項目,叫SharpLang,使用LLVM作為基礎對C#代碼進行編譯。R大指出還有 https://github.com/dotnet/llilc 這個項目
- 優化算法,有可能帶來數十倍的性能提升
- 重構設計和實現,原來的設計可能是錯的,也可能是現在有更好的解決辦法,重構/重新實現可以改善性能
-
.NET運行時的調優
- 如果你使用多線程(包括Parallel),那么你可以修改一下ThreadPool的MinThreads數量
- 如果你調用HttpClient/HttpWebRequest等網絡方法,那么,你可以修改一下ServicePointManager的DefaultConcurrentConnectionLimit,因為微軟為了遵循古老的HTTP規則,對同一個網站最多只允許2個并發連接
- 修改GC為Server模式
如果你想深入研究如何編寫高性能的.NET程序,可以參考Ben Watson編寫的《Writing High-Performance .NET Code》這本書。
如果你還是不滿足于性能表現,可以使用GPU加速,目前比較成熟的解決方案是AleaGPU,對C#的支持非常友好。
將來
Web前端開發技術日新月異,但同時也存在各種臟亂差的情況(筆者會另外撰文詳細述說)。近來各大瀏覽器加入了對Web Assembly的支持,Web Assembly允許開發人員用如C++等語言實現邏輯,然后編譯成二進制的Web Assembly。
最近,微軟宣布ASP.NET項目引入了Blazor項目(取義Browser + Razor),這個項目是基于DotNet Anywhere的,允許開發人員用.NET + Razor實現前端功能。
在Windows平臺上(x86和ARM),你可以使用.NET設計UWP應用,但其它平臺上,你不能用.NET做帶界面的應用。最近對外公布的AvaloniaUI,允許大家使用UWP類似的技術在Linux和MacOS上實現桌面應用,這個項目的名字看出來和當年的Avalon項目的關系了嗎?
現在技術界喜歡搞cross play,譬如Windows 10下自帶了Linux子系統,SQL Server也可以在Linux上跑,JavaScript可以通過node.js寫服務器端代碼,.NET也可以寫Web Assembly做前端。
.NET發展16年,為業界帶來各種新技術的同時,也給人類的發展做出了重大貢獻,它會繼續和老對手Java等一起齊頭并進,互相追趕和促進。
謹以此文紀念我敬重于于2016年9月17日去世的 裝配腦袋 逝世兩周年。
如果你看到這里,那告訴你一個消息:世界那么大,我想去看看。再次上路,去追求心中的理想。
爆棧網
版權所有
所有文章內容版權所有,任何形式的轉發/使用都必須先征得本人書面同意。本人保留一切追究的權利。
浙公網安備 33010602011771號