美文网首页.NET
用.net core 写后端—— c++外的另一种选择?

用.net core 写后端—— c++外的另一种选择?

作者: NET快速开发框架 | 来源:发表于2018-08-08 09:46 被阅读81次

    一、.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)目前支持运行环境

    目前不支持 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标准库部分,原来是3种.net平台都有各自的实现,将来会被.net core统一。

    但就目前来说,.net core的类库还不完善,许多.net framework第三方开发者开始给.net core移植,对很多有心人来说,利用得好是一个商机。

    对web开发者而言,可以跑在linux上的高性能asp.net core + Kestrel很有吸引力。性能对比可以参见这里

    (2)发力云业务

    为什么说.net core更适合容器,甚至成为微软发展的一大目标

    微软在移动领域和设备领域的接连失利,使前CEO和史蒂夫·鲍尔默和其继任者萨蒂亚·纳德拉押宝于云业务。事实上,连续几个季度的财报显示,Azure收入大幅增长(2016Q4102%,2017Q1116%),给整体业务不断下滑的微软注入了新的动力。

    然而,.net framework深度绑定在windows平台上,天然很难与以linux为基础的容器兼容。

    以Docker为代表的容器技术,可以批量地在生产环境中部署,为任何应用创建一个轻量级的、可移植的、自给自足的运行环境。具体可参考coolshell.cn的系列文章。

    为了聚集更多的开发者,构建一个更加完整的生态圈,开发跨平台.net core的应用运行平台,就成为了其发展中不可获取的一环。

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

    (1)从语言规范出发

    语言规范是一门编程语言语法和用法的权威来源,是学术界、业界多方斡旋的结晶,不断推动着语言的发展。

    C++脱胎于C,在各种纷争中在1998年出了第一个正式标准,直到2015年,18年时间才经历了4个标准版本。

    (图片来自zh.wikipedia.org)

    在标准之下,Turbo C++,BorlandC++, 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++团队20100250000/12*20=416667116000532667

    C#团队14150250000/12*14=291666174000309066

    可以看出,每月成本C++远高于C#,约是其1.7倍

    考虑到手游开发的实际情况,我们假设研发周期为6个月,版本运营周期2年,运营期投入1/3人力,c++团队成本约为861W, C#团队成本为825W。成本上C#依然是比较划算。

    团队研发人力成本运营人力成本服务器成本总成本

    C++团队25000003333333.33327840008617333

    C#团队17500002333333.33341760008259333

    同时,我们计算中还没有c#带来的20%开发效率的提升,以及摩尔定律带来的机器成本的降低,也没有考虑人员增加带来的沟通成本,以及雇用更高水平团队的薪资水平。

    总体来说,c#还是比较“省钱”的。

    七、回归到现实:.netcore能给开发带来什么实际意义?

    (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来说,能带来有关语言发展、工具链、模式、云计算等方面的思考,或者说,提供了关于未来的其中一种可能,这已值得我们的关注了。

    转载自腾讯GAD

    相关文章

      网友评论

        本文标题:用.net core 写后端—— c++外的另一种选择?

        本文链接:https://www.haomeiwen.com/subject/oqrtbftx.html