1. 程式人生 > >用.net core 寫後端—— c++外的另一種選擇?

用.net core 寫後端—— c++外的另一種選擇?

https://blog.csdn.net/kenkao/article/details/71249138

用.net core 寫後端—— c++外的另一種選擇?

2017年05月06日 10:40:48 獨孤殘雲 閱讀數:8283

本文原創版權歸 騰訊GAD 171762508 所有,轉載請詳細標明原創作者及出處,以示尊重!

作者:171762508

原文:http://gad.qq.com/article/detail/7181024

 

版權所有,禁止匿名轉載;禁止商業使用;禁止個人使用。

 

一、.net core簡介

(1).net是什麼

  .net實際是遵守同一個標準(ECMA)的多種不同實現,如.net Framework、Mono、和較新的.net core。C#是.net支援的其中一種語言,理論上任何遵循公共語言規範(CLS)的語言都可以執行在.net框架上。

 

(2)什麼是.net core

  .net core 是一個通用開發平臺,由 Microsoft 和Github共同維護。 它是跨平臺的,支援 Windows、macOS 和 Linux,並且可用於裝置、雲和嵌入式/IoT 方案。

 

(3)特點:自動記憶體管理、型別安全、委託和 lambda、泛型、非同步程式設計、LINQ、使用其他非託管程式碼如C/C++。

 

(4).net core組成部分

  .net Runtime:即coreCLR。與.net Framework的CLR沒有太大區別,程序管理,GC,JIT(RyuJIT 編譯器)也都是一樣的。只是針對伺服器系統做了相應優化。CLR和coreCLR進行同步更新,未來coreCLR將一統天下;

  Framework Libraries:即coreFX。包括集合類,檔案系統處理類,XML處理類,非同步Task類等;

  SDK工具和編譯器:即CLI工具和Roslyn編譯器。可以通過.net core SDK獲取;

  .net app host:用來選取並執行對應執行時,提供元件載入原則,以及啟動.netcore應用程式。SDK也是通過相同程式啟動。

 

(5)目前支援執行環境

 

用.net core 寫後端—— c++外的另一種選擇?

 

  目前不支援 ARM64 和 ARM32。

  https://github.com/dotnet/core/blob/master/roadmap.md

 

二、.net core與.net Framework, mono區別

(1).netFramework 的主要差異在於:

  應用模型:.netcore不支援所有.net Framework 應用模型,說白了,就是一切與windows UI相關的如WPF,sliverlight都不支援;

  API:.net core和.net Framework很多API相同,但也有少部分需要修改才能移植到.net core;

  子系統:.netcore實現.net Framework中子系統的子級,目的是實現更簡單的實現和程式設計模型;

  平臺:.netFramework只支援 Windows,而net core跨平臺,支援macOS和Linux;

  開源:.netcore屬於開放源,而.net Framework 的只讀子集屬於開放源。

(2)與 Mono 的主要差異在於

  應用模型:Mono 通過 Xamarin 產品支援 .net Framework 應用模型(例如,Windows Forms)和其他應用模型(例如,Xamarin.iOS)的子集。而 .net core 不支援這些內容;

  API:Mono 使用相同程式集名稱和組成要素支援 .net Framework API 的大型子集;

  平臺:Mono 支援很多平臺和 CPU;

  開源:Mono 和 .net core都使用 MIT 許可證,金主都是.net Foundation;

  焦點: Mono 的戰場是移動平臺,而.net core劍指雲平臺。

  (整理自 https://docs.microsoft.com/zh-cn/dotnet/articles/core/)

 

三、沒有免費的午餐,微軟大有深意

(1)收斂自己的力量

  自從微軟收購Xamarin之後,面臨著同時維護3套基礎庫和平臺相容,一個事情要做3遍還是挺痛苦的,特別是在微軟這樣的大公司裡。對開發者來說,不一致的API導致需要不同類庫實現,程式碼無法得到複用。

  因此,充分運用 .net 平臺十幾年積累的設計理念,汲取過去數十年各種程式語言和開發模型中的精華,重新構建一個更高效能、與特定作業系統解耦、完全模組化、可獨立自包含的開發平臺。同時可以結合微軟在不同作業系統上完善的編譯、測試、團隊合作開發工具,是未來的重要產品。

 

用.net core 寫後端—— c++外的另一種選擇?

 

  如上面那張隨處可見的所示,中間紫色的.net標準庫部分,原來是3種.net平臺都有各自的實現,將來會被.net core統一。 

  但就目前來說,.net core的類庫還不完善,許多.net framework第三方開發者開始給.net core移植,對很多有心人來說,利用得好是一個商機。

  對web開發者而言,可以跑在linux上的高效能asp.net core + Kestrel很有吸引力。效能對比可以參見這裡。

 

(2)發力雲業務

  為什麼說.net core更適合容器,甚至成為微軟發展的一大目標

  微軟在移動領域和裝置領域的接連失利,使前CEO和史蒂夫·鮑爾默和其繼任者薩蒂亞·納德拉押寶於雲業務。事實上,連續幾個季度的財報顯示,Azure收入大幅增長(2016Q4 102%,2017Q1 116%),給整體業務不斷下滑的微軟注入了新的動力。

  然而,.net framework深度繫結在windows平臺上,天然很難與以linux為基礎的容器相容。

  以Docker為代表的容器技術,可以批量地在生產環境中部署,為任何應用建立一個輕量級的、可移植的、自給自足的執行環境。具體可參考 coolshell.cn的系列文章。

  為了聚集更多的開發者,構建一個更加完整的生態圈,開發跨平臺.net core的應用執行平臺,就成為了其發展中不可獲取的一環。

 

四、相比C++,C#正在快速地發展

(1)從語言規範出發

  語言規範是一門程式語言語法和用法的權威來源,是學術界、業界多方斡旋的結晶,不斷推動著語言的發展。

  C++脫胎於C,在各種紛爭中在1998年出了第一個正式標準,直到2015年,18年時間才經歷了4個標準版本。

 

用.net core 寫後端—— c++外的另一種選擇?

(圖片來自zh.wikipedia.org)

 

  在標準之下,Turbo C++,BorlandC++, Microsoft C++, Watcom C++, Symantec C++,intel C++以及linux下的霸主g++,clang百家爭鳴,還爆發過所謂的語言“聖戰”,可謂一路坎坷。

  而C#由微軟主導推動,發展相對比較順利,ECMA標準到2006年共經歷了4版,近年的更新主要以微軟版本為主。

 

用.net core 寫後端—— c++外的另一種選擇?

(圖片來自zh.wikipedia.org)

 

  雖然,標準版本頻繁,不一定代表語言發展就越迅速,但反觀C++,多少團隊還在頭疼升級/更換編譯器,從發展時間和標準制定的頻次, C#和.net卻表現得更加順利和穩健。

 

(2)擁抱開源

  但是微軟也不是一家獨大,mono一度是其最大的競爭對手(其主要貢獻團隊xamarin現在已經被微軟收購),依賴於開源社群,Mono幾乎是與微軟齊頭並進,並在跨移動平臺取得了絕對的優勢(Unity+Xamarin)。

 

用.net core 寫後端—— c++外的另一種選擇?

 

  自從2014年宣佈開源.net core(包含C#在內)之後,微軟2016年9月才正式釋出1.0版本,節奏比較慢。

  但不可否認的是,開源策略促進了.net core的迅速發展,越來越多的人貢獻了程式碼,如下是corefx基礎庫的github截圖(截至2016.12.5)

 

用.net core 寫後端—— c++外的另一種選擇?

 

  據官方訊息,約40%的效能增長來自於開源社群。總體來看,.net core的發展還是非常迅猛的。

 

五、不得不說的效能

  下面是http://benchmarksgame.alioth.debian.org/提供的公開的測評結果,具體程式功能、程式碼、指標可在網站上查閱。

(1)以兩個典型計算任務“spectral-norm”,“計算π”為例,C++, .net core, mono和C++效能對比:

  .net core VS c++

 

用.net core 寫後端—— c++外的另一種選擇?

 

  .net core VS mono

 

用.net core 寫後端—— c++外的另一種選擇?

 

(2)多個語言的比較

  13個標準測試程式,取每種程式最快的作為基數1,評估不同語言的時間和CPU使用情況:

 

用.net core 寫後端—— c++外的另一種選擇?

用.net core 寫後端—— c++外的另一種選擇?

 

  從前面幾個圖可以看到,c(gcc)語言在執行時間和實際CPU負載上遠遠優於其他語言,c++(g++)緊隨其後,Ada/Fortran/Rust/JAVA的表現尚可,.net core與Go一樣屬於第一、二梯隊之間,.net core略遜,但差距不是很大。

  對於.net core來說,其與C++的效能差距在1.5-2倍之間。上下四分位數差(盒子高度)較小,表明其對大部分計算任務來說比較穩定。相比之下,mono效能差了許多,對不同計算任務差異較大,但比墊底的node.js略勝一些。

 

六、開發效率,算一筆賬

(1)使用.net core,效率提高可能體現在

  許多常用基礎庫,如協程、執行緒、記憶體池、鎖等不需要單獨維護

  受前端和後端語言一致,重用性高,對遊戲來說,非常有利於反外掛

  除錯成本降低,大部分遊戲團隊都是windows開發,linux編譯和除錯

  前後臺溝通成本降低,全棧工程師不用在來回切換語言中煩惱

  降低新人學習成本

 

(2)人力成本VS機器成本?

  以公開的資料為例,網易的“絕代雙驕”手遊前端採用Unity,後端採用.net core進行開發,據說能降低30%的人員成本,提高20%的開發速度。如下:

 

用.net core 寫後端—— c++外的另一種選擇?

 

  資料說話,可以簡單算這樣的一筆賬:假設現有兩個團隊,後端分別使用C++和C# .net core,  費用估計如下

  生產環境參考AWS的M4.2xlarge (2.3 GHz Intel Xeon® E5-2686 v4, 8G+32G,頻寬費用不計)

  一個月的成本大概是2320RMB,假設自建機房能節約50%的費用,則為1160RMB/月,

  假設使用C#,伺服器數量增加50%(根據上文效能估計)

  人力成本按人25W年薪(網易應屆生平均成本)計算

 

用.net core 寫後端—— c++外的另一種選擇?

 

  可以看出,每月成本C++遠高於C#,約是其1.7倍。

  考慮到手遊開發的實際情況,我們假設研發週期為6個月,版本運營週期2年,運營期投入1/3人力,c++團隊成本約為861W, C#團隊成本為825W。成本上C#依然是比較划算。

 

用.net core 寫後端—— c++外的另一種選擇?

 

  同時,我們計算中還沒有c#帶來的20%開發效率的提升,以及摩爾定律帶來的機器成本的降低,也沒有考慮人員增加帶來的溝通成本,以及僱用更高水平團隊的薪資水平。

  總體來說,c#還是比較“省錢”的。

 

七、迴歸到現實:.netcore能給開發帶來什麼實際意義?

(1)反外掛是一個非常合適的場景,特別是前端模擬-後端校驗的遊戲專案,不用在語言移植、模型校驗、緩慢的mono虛擬機器之間糾結了;

(2)豐富的通用元件和標準庫可以減少大量造車輪的時間,前提是要杜絕效能“潔癖”;

(3)不用糾結判空指標、使用class還是struct、各種記憶體分配和回收問題、多位元組字串編碼;

(4)在處理IO和多執行緒方面更有信心一些,擁抱多核和異構計算;

(5)大前端的趨勢下,未來是微服務、輕應用、H5遊戲的世界。必定更青睞包袱更輕的、移植性強、跨平臺的開發思想和工具。在高效能、高吞吐量、低延遲方面,.net core開始嶄露頭角,如下圖所示,asp.net core的效能已經遠遠甩開node.js和asp.net 4。

 

用.net core 寫後端—— c++外的另一種選擇?

 

  圖片來源:https://www.ageofascent.com/2016/02/18/asp-net-core-exeeds-1-15-million-requests-12-6-gbps/

 

八、結語

  總的來說,不管是.net也好,C#也罷,並不是一個新鮮的事物。.net core嚴格來說也算不上具備偉大創新性或者突破力的“面壁者”。

  但對於許多C++er來說,能帶來有關語言發展、工具鏈、模式、雲端計算等方面的思考,或者說,提供了關於未來的其中一種可能,這已值得我們的關注了。