腾讯WeTest/专栏文章/用.net core 写后端—— c++外的另一种选择?/

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

开发测试干货
57437

一、.net core简介

1.net是什么

.net实际是遵守同一个标准(ECMA)的多种不同实现,如.net FrameworkMono、和较新的.net coreC#.net支持的其中一种语言,理论上任何遵循公共语言规范(CLS)的语言都可以运行在.net框架上。

2)什么是.net core

.net core 是一个通用开发平台,由 Microsoft Github共同维护。 它是跨平台的,支持 WindowsmacOS  Linux,并且可用于设备、云和嵌入式/IoT 方案。

3)特点:自动内存管理、类型安全、委托和 lambda、泛型、异步编程、LINQ、使用其他非托管代码如C/C++

4.net core组成部分

ü   .net Runtime:即coreCLR。与.net FrameworkCLR没有太大区别,进程管理,GCJITRyuJIT 编译器)也都是一样的。只是针对服务器系统做了相应优化。CLRcoreCLR进行同步更新,未来coreCLR将一统天下;

ü   Framework Libraries:即coreFX。包括集合类,文件系统处理类,XML处理类,异步Task类等;

ü   SDK工具和编译器:即CLI工具和Roslyn编译器。可以通过.net core SDK获取;

ü   .net app host:用来选取并执行对应运行时,提供组件载入原则,以及启动.netcore应用程序。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.netFramework 的主要差异在于:

ü  应用模型:.netcore不支持所有.net Framework 应用模型,说白了,就是一切与windows UI相关的如WPFsliverlight都不支持;

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

ü  子系统:.netcore实现.net Framework中子系统的子级,目的是实现更简单的实现和编程模型;

ü  平台:.netFramework只支持 Windows,而net core跨平台,支持macOSLinux

ü  开源:.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收入大幅增长(2016Q4 102%,2017Q1 116%),给整体业务不断下滑的微软注入了新的动力。

然而,.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#在内)之后,微软20169月才正式发布1.0版本,节奏比较慢。

但不可否认的是,开源策略促进了.net core的迅速发展,越来越多的人贡献了代码,如下是corefx基础库的github截图(截至2016.12.5

 据官方消息,约40%的性能增长来自于开源社区。总体来看,.net core的发展还是非常迅猛的。

 

五、不得不说的性能

   下面是http://benchmarksgame.alioth.debian.org/提供的公开的测评结果,具体程序功能、代码、指标可在网站上查阅。

1)以两个典型计算任务“spectral-norm”,“计算π”为例,C++, .net core, monoC++性能对比:

.net core VS c++

 

.net core VS mono

 

 (2)多个语言的比较

13个标准测试程序,取每种程序最快的作为基数1,评估不同语言的时间和CPU使用情况:

 

 

从前面几个图可以看到,c(gcc)语言在执行时间和实际CPU负载上远远优于其他语言,c++(g++)紧随其后,Ada/Fortran/Rust/JAVA的表现尚可,.net coreGo一样属于第一、二梯队之间,.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,  费用估计如下

ü  生产环境参考AWSM4.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#还是比较“省钱”的。

 

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

1)反外挂是一个非常合适的场景,特别是前端模拟-后端校验的游戏项目,不用在语言移植、模型校验、缓慢的mono虚拟机之间纠结了;

2)丰富的通用组件和标准库可以减少大量造车轮的时间,前提是要杜绝性能“洁癖”;

3)不用纠结判空指针、使用class还是struct、各种内存分配和回收问题、多字节字符串编码;

4)在处理IO和多线程方面更有信心一些,拥抱多核和异构计算;

5)大前端的趋势下,未来是微服务、轻应用、H5游戏的世界。必定更青睐包袱更轻的、移植性强、跨平台的开发思想和工具。在高性能、高吞吐量、低延迟方面,.net core开始崭露头角,如下图所示,asp.net core的性能已经远远甩开node.jsasp.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



关于腾讯WeTest (wetest.qq.com)

腾讯WeTest是腾讯游戏官方推出的一站式游戏测试平台,用十年腾讯游戏测试经验帮助广大开发者对游戏开发全生命周期进行质量保障。腾讯WeTest提供:适配兼容测试;云端真机调试;安全测试;耗电量测试;服务器性能测试;舆情监控等服务。

点击地址:http://wetest.qq.com/立即体验!

热度排行榜

购买
客服
反馈