一、.net core简介
(1).net是什么
.net实际是遵守同一个标准(ECMA)的多种不同实现,如.net Framework、Mono、和较新的.netcore。C#是.net支持的其中一种语言,理论上任何遵循公共语言规范(CLS)的语言都可以运行在.net框架上。
(2)什么是.net core
.netcore 是一个通用开发平台,由 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:用来选取并执行对应运行时,提供组件载入原则,以及启动.net core应用程序。SDK也是通过相同程序启动。
(5)目前支持运行环境
操作系统 | 版本 | 架构 |
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区别
(1).net Framework 的主要差异在于:
应用模型:.netcore不支持所有.net Framework 应用模型,说白了,就是一切与windows UI相关的如WPF,sliverlight都不支持;
API:.netcore和.net Framework很多API相同,但也有少部分需要修改才能移植到.netcore;
子系统:.netcore实现.net Framework中子系统的子级,目的是实现更简单的实现和编程模型;
平台:.net Framework只支持 Windows,而netcore跨平台,支持macOS和Linux;
开源:.netcore属于开放源,而.net Framework 的只读子集属于开放源。
(2)与 Mono 的主要差异在于
应用模型:Mono 通过 Xamarin 产品支持 .net Framework 应用模型(例如,Windows Forms)和其他应用模型(例如,Xamarin.iOS)的子集。 而 .netcore不支持这些内容;
API:Mono 使用相同程序集名称和组成要素支持 .net Framework API 的大型子集;
平台:Mono 支持很多平台和 CPU;
开源:Mono 和 .netcore都使用 MIT 许可证,金主都是.net Foundation;
焦点:Mono 的战场是移动平台,而.netcore剑指云平台。
(整理自https://docs.microsoft.com/zh-cn/dotnet/articles/core/)
三、没有免费的午餐,微软大有深意
(1)收敛自己的力量
自从微软收购Xamarin之后,面临着同时维护3套基础库和平台兼容,一个事情要做3遍还是挺痛苦的,特别是在微软这样的大公司里。对开发者来说,不一致的API导致需要不同类库实现,代码无法得到复用。
因此,充分运用 .net 平台十几年积累的设计理念,汲取过去数十年各种编程语言和开发模型中的精华,重新构建一个更高性能、与特定操作系统解耦、完全模块化、可独立自包含的开发平台。同时可以结合微软在不同操作系统上完善的编译、测试、团队合作开发工具,是未来的重要产品。
如上面那张随处可见的所示,中间紫色的.net标准库部分,原来是3种.net平台都有各自的实现,将来会被.net core统一。
但目前来说,.net core的类库还不完善,许多.net framework第三方开发者开始给.net core移植,对很多有心人来说,利用得好是一个商机。
对web开发者而言,可以跑在linux上的高性能asp.net core + Kestrel很有吸引力。性能对比可以参见这里。
(2)发力云业务
微软在移动领域和设备领域的接连失利,使前CEO和史蒂夫·鲍尔默和其继任者萨蒂亚·纳德拉押宝于云业务。事实上,连续几个季度的财报显示,Azure收入大幅增长(2016Q4102%,2017Q1 116%),给整体业务不断下滑的微软注入了新的动力。
然而,.net framework深度绑定在windows平台上,天然很难与以linux为基础的容器兼容。
以Docker为代表的容器技术,可以批量地在生产环境中部署,为任何应用创建一个轻量级的、可移植的、自给自足的运行环境。具体可参考coolshell.cn的系列文章。
为了聚集更多的开发者,构建一个更加完整的生态圈,开发跨平台.netcore的应用运行平台,就成为了其发展中不可获取的一环。
四、相比C++,C#正在快速地发展
(1)从语言规范出发
语言规范是一门编程语言语法和用法的权威来源,是学术界、业界多方斡旋的结晶,不断推动着语言的发展。
C++脱胎于C,在各种纷争中在1998年出了第一个正式标准,直到2015年,18年时间才经历了4个标准版本。
(图片来自zh.wikipedia.org)
在标准之下,Turbo C++,Borland C++, Microsoft C++, Watcom C++, Symantec C++,intel C++以及linux下的霸主g++,clang百家争鸣,还爆发过所谓的语言“圣战”,可谓一路坎坷。
而C#由微软主导推动,发展相对比较顺利,ECMA标准到2006年共经历了4版,近年的更新主要以微软版本为主。
(图片来自zh.wikipedia.org)
虽然,标准版本频繁,不一定代表语言发展就越迅速,但反观C++,多少团队还在头疼升级/更换编译器,从发展时间和标准制定的频次, C#和.net却表现得更加顺利和稳健。
(2)拥抱开源
但是微软也不是一家独大,mono一度是其最大的竞争对手(其主要贡献团队xamarin现在已经被微软收购),依赖于开源社区,Mono几乎是与微软齐头并进,并在跨移动平台取得了绝对的优势(Unity+Xamarin)。
自从2014年宣布开源.net core(包含C#在内)之后,微软2016年9月才正式发布1.0版本,节奏比较慢。
但不可否认的是,开源策略促进了.net core的迅速发展,越来越多的人贡献了代码,如下是corefx基础库的github截图(截至2016.12.5)
据官方消息,约40%的性能增长来自于开源社区。总体来看,.net core的发展还是非常迅猛的。
五、不得不说的性能
下面是http://benchmarksgame.alioth.debian.org/提供的公开的测评结果,具体程序功能、代码、指标可在网站上查阅。
(1)以两个典型计算任务“spectral-norm”,“计算π”为例,C++, .net core, mono和C++性能对比:
.net core VS c++
.net core VS mono
(2)多个语言的比较
13个标准测试程序,取每种程序最快的作为基数1,评估不同语言的时间和CPU使用情况:
从前面几个图可以看到,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%的开发速度。如下:
数据说话,可以简单算这样的一笔账:假设现有两个团队,后端分别使用C++和C# .net core, 费用估计如下
生产环境参考AWS的M4.2xlarge (2.3 GHz Intel Xeon® E5-2686 v4, 8G+32G,带宽费用不计)
一个月的成本大概是2320RMB,假设自建机房能节约50%的费用,则为1160RMB/月,
假设使用C#,服务器数量增加50%(根据上文性能估计)
人力成本按人25W年薪(网易应届生平均成本)计算
团队 | 投入人员 | 服务器数量 | 人力成本 | 服务器成本 | 总成本 |
C++团队 | 20 | 100 | 250000/12*20=416667 | 116000 | 532667 |
C#团队 | 14 | 150 | 250000/12*14=291666 | 174000 | 309066 |
可以看出,每月成本C++远高于C#,约是其1.7倍。
考虑到手游开发的实际情况,我们假设研发周期为6个月,版本运营周期2年,运营期投入1/3人力,c++团队成本约为861W, C#团队成本为825W。成本上C#依然是比较划算。
团队 | 研发人力成本 | 运营人力成本 | 服务器成本 | 总成本 |
C++团队 | 2500000 | 3333333.333 | 2784000 | 8617333 |
C#团队 | 1750000 | 2333333.333 | 4176000 | 8259333 |
同时,我们计算中还没有c#带来的20%开发效率的提升,以及摩尔定律带来的机器成本的降低,也没有考虑人员增加带来的沟通成本,以及雇用更高水平团队的薪资水平。
总体来说,c#还是比较“省钱”的。
七、回归到现实:.net core能给开发带来什么实际意义?
(1)反外挂是一个非常合适的场景,特别是前端模拟-后端校验的游戏项目,不用在语言移植、模型校验、缓慢的mono虚拟机之间纠结了;
(2)丰富的通用组件和标准库可以减少大量造车轮的时间,前提是要杜绝性能“洁癖”;
(3)不用纠结判空指针、使用class还是struct、各种内存分配和回收问题、多字节字符串编码;
(4)在处理IO和多线程方面更有信心一些,拥抱多核和异构计算;
(5)大前端的趋势下,未来是微服务、轻应用、H5游戏的世界。必定更青睐包袱更轻的、移植性强、跨平台的开发思想和工具。在高性能、高吞吐量、低延迟方面,.net core开始崭露头角,如下图所示,asp.net core的性能已经远远甩开node.js和asp.net 4。
图片来源:https://www.ageofascent.com/2016/02/18/asp-net-core-exeeds-1-15-million-requests-12-6-gbps/
八、结语
总的来说,不管是.net也好,C#也罢,并不是一个新鲜的事物。.net core严格来说也算不上具备伟大创新性或者突破力的“面壁者”。
对于许多C++er来说,能带来有关语言发展、工具链、模式、云计算等方面的思考,或者说,提供了关于未来的其中一种可能,这已值得关注了。
原文地址:https://km.tencent.com/openkm/url/q4blcn
.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注