用.net core 写后端—— c++外的另一种选择?
一、.net core簡(jiǎn)介
(1).net是什么
? ??.net實(shí)際是遵守同一個(gè)標(biāo)準(zhǔn)(ECMA)的多種不同實(shí)現(xiàn),如.net Framework、Mono、和較新的.netcore。C#是.net支持的其中一種語(yǔ)言,理論上任何遵循公共語(yǔ)言規(guī)范(CLS)的語(yǔ)言都可以運(yùn)行在.net框架上。
(2)什么是.net core
? ? .netcore?是一個(gè)通用開(kāi)發(fā)平臺(tái),由?Microsoft?和Github共同維護(hù)。 它是跨平臺(tái)的,支持Windows、macOS?和?Linux,并且可用于設(shè)備、云和嵌入式/IoT?方案。
(3)特點(diǎn):自動(dòng)內(nèi)存管理、類型安全、委托和?lambda、泛型、異步編程、LINQ、使用其他非托管代碼如C/C++。
(4).net core組成部分
.net Runtime:即coreCLR。與.net Framework的CLR沒(méi)有太大區(qū)別,進(jìn)程管理,GC,JIT(RyuJIT?編譯器)也都是一樣的。只是針對(duì)服務(wù)器系統(tǒng)做了相應(yīng)優(yōu)化。CLR和coreCLR進(jìn)行同步更新,未來(lái)coreCLR將一統(tǒng)天下;
Framework Libraries:即coreFX。包括集合類,文件系統(tǒng)處理類,XML處理類,異步Task類等;
SDK工具和編譯器:即CLI工具和Roslyn編譯器??梢酝ㄟ^(guò).net core SDK獲取;
.net app host:用來(lái)選取并執(zhí)行對(duì)應(yīng)運(yùn)行時(shí),提供組件載入原則,以及啟動(dòng).net core應(yīng)用程序。SDK也是通過(guò)相同程序啟動(dòng)。
?
(5)目前支持運(yùn)行環(huán)境
操作系統(tǒng) | 版本 | 架構(gòu) |
Windows Client | 7 SP1 - 10 | x64, x86 |
Windows Server | 2008 R2 SP1 - 2016 | x64, x86 |
Red Hat Enterprise Linux | 7.2 | x64 |
Fedora | 23 | x64 |
Debian | 8.2 | x64 |
Ubuntu | 14.04 LTS, 16.04 LTS | x64 |
Linux Mint | 17 | x64 |
openSUSE | 13.2 | x64 |
Centos | 7.1 | x64 |
Oracle Linux | 7.1 | x64 |
Mac OS X | 10.11, 10.12 | x64 |
? ??目前不支持?ARM64?和?ARM32。
https://github.com/dotnet/core/blob/master/roadmap.md
二、.net core與.net Framework, mono區(qū)別
(1).net Framework?的主要差異在于:
應(yīng)用模型:.netcore不支持所有.net Framework?應(yīng)用模型,說(shuō)白了,就是一切與windows UI相關(guān)的如WPF,sliverlight都不支持;
API:.netcore和.net Framework很多API相同,但也有少部分需要修改才能移植到.netcore;
子系統(tǒng):.netcore實(shí)現(xiàn).net Framework中子系統(tǒng)的子級(jí),目的是實(shí)現(xiàn)更簡(jiǎn)單的實(shí)現(xiàn)和編程模型;
平臺(tái):.net Framework只支持?Windows,而netcore跨平臺(tái),支持macOS和Linux;
開(kāi)源:.netcore屬于開(kāi)放源,而.net Framework?的只讀子集屬于開(kāi)放源。
(2)與?Mono?的主要差異在于
應(yīng)用模型:Mono?通過(guò)?Xamarin?產(chǎn)品支持?.net Framework?應(yīng)用模型(例如,Windows Forms)和其他應(yīng)用模型(例如,Xamarin.iOS)的子集。 而?.netcore不支持這些內(nèi)容;
API:Mono?使用相同程序集名稱和組成要素支持?.net Framework API?的大型子集;
平臺(tái):Mono?支持很多平臺(tái)和?CPU;
開(kāi)源:Mono?和?.netcore都使用?MIT?許可證,金主都是.net Foundation;
焦點(diǎn):Mono?的戰(zhàn)場(chǎng)是移動(dòng)平臺(tái),而.netcore劍指云平臺(tái)。
? ? ? ? ? ? ?(整理自https://docs.microsoft.com/zh-cn/dotnet/articles/core/)?
三、沒(méi)有免費(fèi)的午餐,微軟大有深意
(1)收斂自己的力量
? ??自從微軟收購(gòu)Xamarin之后,面臨著同時(shí)維護(hù)3套基礎(chǔ)庫(kù)和平臺(tái)兼容,一個(gè)事情要做3遍還是挺痛苦的,特別是在微軟這樣的大公司里。對(duì)開(kāi)發(fā)者來(lái)說(shuō),不一致的API導(dǎo)致需要不同類庫(kù)實(shí)現(xiàn),代碼無(wú)法得到復(fù)用。
? ??因此,充分運(yùn)用?.net?平臺(tái)十幾年積累的設(shè)計(jì)理念,汲取過(guò)去數(shù)十年各種編程語(yǔ)言和開(kāi)發(fā)模型中的精華,重新構(gòu)建一個(gè)更高性能、與特定操作系統(tǒng)解耦、完全模塊化、可獨(dú)立自包含的開(kāi)發(fā)平臺(tái)。同時(shí)可以結(jié)合微軟在不同操作系統(tǒng)上完善的編譯、測(cè)試、團(tuán)隊(duì)合作開(kāi)發(fā)工具,是未來(lái)的重要產(chǎn)品。
? ??如上面那張隨處可見(jiàn)的所示,中間紫色的.net標(biāo)準(zhǔn)庫(kù)部分,原來(lái)是3種.net平臺(tái)都有各自的實(shí)現(xiàn),將來(lái)會(huì)被.net core統(tǒng)一。?
? ??但目前來(lái)說(shuō),.net core的類庫(kù)還不完善,許多.net framework第三方開(kāi)發(fā)者開(kāi)始給.net core移植,對(duì)很多有心人來(lái)說(shuō),利用得好是一個(gè)商機(jī)。
? ??對(duì)web開(kāi)發(fā)者而言,可以跑在linux上的高性能asp.net core + Kestrel很有吸引力。性能對(duì)比可以參見(jiàn)這里。
(2)發(fā)力云業(yè)務(wù)
? ??微軟在移動(dòng)領(lǐng)域和設(shè)備領(lǐng)域的接連失利,使前CEO和史蒂夫·鮑爾默和其繼任者薩蒂亞·納德拉押寶于云業(yè)務(wù)。事實(shí)上,連續(xù)幾個(gè)季度的財(cái)報(bào)顯示,Azure收入大幅增長(zhǎng)(2016Q4102%,2017Q1?116%),給整體業(yè)務(wù)不斷下滑的微軟注入了新的動(dòng)力。
? ??然而,.net framework深度綁定在windows平臺(tái)上,天然很難與以linux為基礎(chǔ)的容器兼容。
? ??以Docker為代表的容器技術(shù),可以批量地在生產(chǎn)環(huán)境中部署,為任何應(yīng)用創(chuàng)建一個(gè)輕量級(jí)的、可移植的、自給自足的運(yùn)行環(huán)境。具體可參考coolshell.cn的系列文章。
? ??為了聚集更多的開(kāi)發(fā)者,構(gòu)建一個(gè)更加完整的生態(tài)圈,開(kāi)發(fā)跨平臺(tái).netcore的應(yīng)用運(yùn)行平臺(tái),就成為了其發(fā)展中不可獲取的一環(huán)。?
四、相比C++,C#正在快速地發(fā)展
(1)從語(yǔ)言規(guī)范出發(fā)
? ??語(yǔ)言規(guī)范是一門編程語(yǔ)言語(yǔ)法和用法的權(quán)威來(lái)源,是學(xué)術(shù)界、業(yè)界多方斡旋的結(jié)晶,不斷推動(dòng)著語(yǔ)言的發(fā)展。
? ??C++脫胎于C,在各種紛爭(zhēng)中在1998年出了第一個(gè)正式標(biāo)準(zhǔn),直到2015年,18年時(shí)間才經(jīng)歷了4個(gè)標(biāo)準(zhǔn)版本。
(圖片來(lái)自zh.wikipedia.org)
? ??在標(biāo)準(zhǔn)之下,Turbo C++,Borland C++, Microsoft C++, Watcom C++,?Symantec C++,intel C++以及linux下的霸主g++,clang百家爭(zhēng)鳴,還爆發(fā)過(guò)所謂的語(yǔ)言“圣戰(zhàn)”,可謂一路坎坷。
? ??而C#由微軟主導(dǎo)推動(dòng),發(fā)展相對(duì)比較順利,ECMA標(biāo)準(zhǔn)到2006年共經(jīng)歷了4版,近年的更新主要以微軟版本為主。
(圖片來(lái)自zh.wikipedia.org)
? ??雖然,標(biāo)準(zhǔn)版本頻繁,不一定代表語(yǔ)言發(fā)展就越迅速,但反觀C++,多少團(tuán)隊(duì)還在頭疼升級(jí)/更換編譯器,從發(fā)展時(shí)間和標(biāo)準(zhǔn)制定的頻次,?C#和.net卻表現(xiàn)得更加順利和穩(wěn)健。?
(2)擁抱開(kāi)源
? ??但是微軟也不是一家獨(dú)大,mono一度是其最大的競(jìng)爭(zhēng)對(duì)手(其主要貢獻(xiàn)團(tuán)隊(duì)xamarin現(xiàn)在已經(jīng)被微軟收購(gòu)),依賴于開(kāi)源社區(qū),Mono幾乎是與微軟齊頭并進(jìn),并在跨移動(dòng)平臺(tái)取得了絕對(duì)的優(yōu)勢(shì)(Unity+Xamarin)。
? ??自從2014年宣布開(kāi)源.net core(包含C#在內(nèi))之后,微軟2016年9月才正式發(fā)布1.0版本,節(jié)奏比較慢。
? ??但不可否認(rèn)的是,開(kāi)源策略促進(jìn)了.net core的迅速發(fā)展,越來(lái)越多的人貢獻(xiàn)了代碼,如下是corefx基礎(chǔ)庫(kù)的github截圖(截至2016.12.5)
?? ??據(jù)官方消息,約40%的性能增長(zhǎng)來(lái)自于開(kāi)源社區(qū)。總體來(lái)看,.net core的發(fā)展還是非常迅猛的。?
五、不得不說(shuō)的性能
? ??下面是http://benchmarksgame.alioth.debian.org/提供的公開(kāi)的測(cè)評(píng)結(jié)果,具體程序功能、代碼、指標(biāo)可在網(wǎng)站上查閱。
(1)以兩個(gè)典型計(jì)算任務(wù)“spectral-norm”,“計(jì)算π”為例,C++, .net core, mono和C++性能對(duì)比:
.net core VS c++
.net core VS mono
?
?(2)多個(gè)語(yǔ)言的比較
? ??13個(gè)標(biāo)準(zhǔn)測(cè)試程序,取每種程序最快的作為基數(shù)1,評(píng)估不同語(yǔ)言的時(shí)間和CPU使用情況:
?
? ??從前面幾個(gè)圖可以看到,c(gcc)語(yǔ)言在執(zhí)行時(shí)間和實(shí)際CPU負(fù)載上遠(yuǎn)遠(yuǎn)優(yōu)于其他語(yǔ)言,c++(g++)緊隨其后,Ada/Fortran/Rust/JAVA的表現(xiàn)尚可,.net core與Go一樣屬于第一、二梯隊(duì)之間,.net core略遜,但差距不是很大。
? ??對(duì)于.net core來(lái)說(shuō),其與C++的性能差距在1.5-2倍之間。上下四分位數(shù)差(盒子高度)較小,表明其對(duì)大部分計(jì)算任務(wù)來(lái)說(shuō)比較穩(wěn)定。相比之下,mono性能差了許多,對(duì)不同計(jì)算任務(wù)差異較大,但比墊底的node.js略勝一些。?
六、開(kāi)發(fā)效率,算一筆賬
(1)使用.net core,效率提高可能體現(xiàn)在
許多常用基礎(chǔ)庫(kù),如協(xié)程、線程、內(nèi)存池、鎖等不需要單獨(dú)維護(hù)
受前端和后端語(yǔ)言一致,重用性高,對(duì)游戲來(lái)說(shuō),非常有利于反外掛
調(diào)試成本降低,大部分游戲團(tuán)隊(duì)都是windows開(kāi)發(fā),linux編譯和調(diào)試
前后臺(tái)溝通成本降低,全棧工程師不用在來(lái)回切換語(yǔ)言中煩惱
降低新人學(xué)習(xí)成本
?
(2)人力成本VS機(jī)器成本?
? ??以公開(kāi)的資料為例,網(wǎng)易的“絕代雙驕”手游前端采用Unity,后端采用.net core進(jìn)行開(kāi)發(fā),據(jù)說(shuō)能降低30%的人員成本,提高20%的開(kāi)發(fā)速度。如下:?
? ??數(shù)據(jù)說(shuō)話,可以簡(jiǎn)單算這樣的一筆賬:假設(shè)現(xiàn)有兩個(gè)團(tuán)隊(duì),后端分別使用C++和C# .net core,??費(fèi)用估計(jì)如下
生產(chǎn)環(huán)境參考AWS的M4.2xlarge?(2.3 GHz Intel Xeon? E5-2686 v4,?8G+32G,帶寬費(fèi)用不計(jì))
一個(gè)月的成本大概是2320RMB,假設(shè)自建機(jī)房能節(jié)約50%的費(fèi)用,則為1160RMB/月,
假設(shè)使用C#,服務(wù)器數(shù)量增加50%(根據(jù)上文性能估計(jì))
人力成本按人25W年薪(網(wǎng)易應(yīng)屆生平均成本)計(jì)算
?
團(tuán)隊(duì) | 投入人員 | 服務(wù)器數(shù)量 | 人力成本 | 服務(wù)器成本 | 總成本 |
C++團(tuán)隊(duì) | 20 | 100 | 250000/12*20=416667 | 116000 | 532667 |
C#團(tuán)隊(duì) | 14 | 150 | 250000/12*14=291666 | 174000 | 309066 |
可以看出,每月成本C++遠(yuǎn)高于C#,約是其1.7倍。
?
? ??考慮到手游開(kāi)發(fā)的實(shí)際情況,我們假設(shè)研發(fā)周期為6個(gè)月,版本運(yùn)營(yíng)周期2年,運(yùn)營(yíng)期投入1/3人力,c++團(tuán)隊(duì)成本約為861W,?C#團(tuán)隊(duì)成本為825W。成本上C#依然是比較劃算。
團(tuán)隊(duì) | 研發(fā)人力成本 | 運(yùn)營(yíng)人力成本 | 服務(wù)器成本 | 總成本 |
C++團(tuán)隊(duì) | 2500000 | 3333333.333 | 2784000 | 8617333 |
C#團(tuán)隊(duì) | 1750000 | 2333333.333 | 4176000 | 8259333 |
?
? ??同時(shí),我們計(jì)算中還沒(méi)有c#帶來(lái)的20%開(kāi)發(fā)效率的提升,以及摩爾定律帶來(lái)的機(jī)器成本的降低,也沒(méi)有考慮人員增加帶來(lái)的溝通成本,以及雇用更高水平團(tuán)隊(duì)的薪資水平。
? ??總體來(lái)說(shuō),c#還是比較“省錢”的。
?
七、回歸到現(xiàn)實(shí):.net core能給開(kāi)發(fā)帶來(lái)什么實(shí)際意義?
?(1)反外掛是一個(gè)非常合適的場(chǎng)景,特別是前端模擬-后端校驗(yàn)的游戲項(xiàng)目,不用在語(yǔ)言移植、模型校驗(yàn)、緩慢的mono虛擬機(jī)之間糾結(jié)了;
(2)豐富的通用組件和標(biāo)準(zhǔn)庫(kù)可以減少大量造車輪的時(shí)間,前提是要杜絕性能“潔癖”;
(3)不用糾結(jié)判空指針、使用class還是struct、各種內(nèi)存分配和回收問(wèn)題、多字節(jié)字符串編碼;
(4)在處理IO和多線程方面更有信心一些,擁抱多核和異構(gòu)計(jì)算;
(5)大前端的趨勢(shì)下,未來(lái)是微服務(wù)、輕應(yīng)用、H5游戲的世界。必定更青睞包袱更輕的、移植性強(qiáng)、跨平臺(tái)的開(kāi)發(fā)思想和工具。在高性能、高吞吐量、低延遲方面,.net core開(kāi)始嶄露頭角,如下圖所示,asp.net core的性能已經(jīng)遠(yuǎn)遠(yuǎn)甩開(kāi)node.js和asp.net 4。
?圖片來(lái)源:https://www.ageofascent.com/2016/02/18/asp-net-core-exeeds-1-15-million-requests-12-6-gbps/?
八、結(jié)語(yǔ)
? ??總的來(lái)說(shuō),不管是.net也好,C#也罷,并不是一個(gè)新鮮的事物。.net core嚴(yán)格來(lái)說(shuō)也算不上具備偉大創(chuàng)新性或者突破力的“面壁者”。
? ? 對(duì)于許多C++er來(lái)說(shuō),能帶來(lái)有關(guān)語(yǔ)言發(fā)展、工具鏈、模式、云計(jì)算等方面的思考,或者說(shuō),提供了關(guān)于未來(lái)的其中一種可能,這已值得關(guān)注了。
原文地址:https://km.tencent.com/openkm/url/q4blcn
.NET社區(qū)新聞,深度好文,微信中搜索dotNET跨平臺(tái)或掃描二維碼關(guān)注
贊賞
人贊賞
總結(jié)
以上是生活随笔為你收集整理的用.net core 写后端—— c++外的另一种选择?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: WebAPi的可视化输出模式(Rabbi
- 下一篇: 在Visual Studio中使用任何C