用.net core 写后端—— c++外的另一种选择?
一、.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%,2017Q1116%),给整体业务不断下滑的微软注入了新的动力。
然而,.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跨平台或扫描二维码关注
赞赏
人赞赏
用.net core 写后端—— c++外的另一种选择?相关推荐
- 前端老弟第一次写后端,崩了!
幽默轻松小知识,一起来看看老弟第一次写的后端代码,你觉得如何? 大家好,我是鱼皮,今天分享我的老弟第一次写后端代码时出现的囧事,希望大家引以为戒. 孽起 我的老弟小阿巴,目前大一,自学编程有一段时间了 ...
- 给 asp.net core 写个中间件来记录接口耗时
给 asp.net core 写个中间件来记录接口耗时 Intro 写接口的难免会遇到别人说接口比较慢,到底慢多少,一个接口服务器处理究竟花了多长时间,如果能有具体的数字来记录每个接口耗时多少,别人再 ...
- 给 asp.net core 写一个简单的健康检查
给 asp.net core 写一个简单的健康检查 Intro 健康检查可以帮助我们知道应用的当前状态是不是处于良好状态,现在无论是 docker 还是 k8s 还是现在大多数的服务注册发现大多都提供 ...
- 手把手教你用.NET Core写爬虫
写在前面 自从上一个项目58HouseSearch从.NET迁移到.NET core之后,磕磕碰碰磨蹭了一个月才正式上线到新版本. 然后最近又开了个新坑,搞了个Dy2018Crawler用来爬dy20 ...
- 一张我为写植物大战僵尸外.挂而画的草稿图...
一张我为写植物大战僵尸外.挂而画的草稿图... 呵呵,为了以后复习方便,写篇文章以记之...
- 用php写后端怎么使用模板_用PHP保守秘密
用php写后端怎么使用模板 Introduction 介绍 People have always sought ways to keep secrets from prying eyes or to ...
- python写后端提供api_python写后端api
有没有大神分享一个纯python无框架写的webapi后端...python自学完了,想写个api练练手,CSS布局HTML小编今天和大家分享个案例代码来借鉴借鉴精华 你可能有误解,无框架要比使用框架 ...
- 手把手教你用.NET Core写爬虫 1
写在前面 自从上一个项目58HouseSearch从.NET迁移到.NET core之后,磕磕碰碰磨蹭了一个月才正式上线到新版本. 然后最近又开了个新坑,搞了个Dy2018Crawler用来爬dy20 ...
- Base: ACID外的另外一种选择
Base: ACID外的另外一种选择 在分区数据库中,为可用性牺牲一定的一致性能够显著提高可扩展性 DAN PRITCHETT, EBAY 在过去的十年中,Web应用变得日益流行.无论您是为最终 ...
最新文章
- 行式填报表轻松搞定流水号
- 吴恩达深度学习笔记7-Course2-Week3【超参数调试、Batch 正则化和程序框架】
- php绘图效率,对于PHP绘图技术的理解
- 鼠标经过图片抖动效果
- 人生路漫漫,还得多输出
- 【转载】Weka入门教程
- Python分析热门话题“不生孩子的人后来都怎么了”,看看丁克家庭最后都怎么样了...
- setcellvalue 格式_Java Cell.setCellValue方法代码示例
- 集备二Linux部署之FTP
- hightcharts 如何修改legend图例的样式
- java反射 获取方法_java反射——获取类的方法信息
- 原来 GitHub 网红是这么混出来的 如何以正确的姿势参与开源项目
- P5556 圣剑护符 题解
- 浅谈深度学习:基于对LSTM项目`LSTM Neural Network for Time Series Prediction`的理解与回顾
- 如何在unity使用数据库
- JavaWeb学习-案例练习-图书管理前台-9-分页功能实现
- 车联网赋能末端物流自动驾驶探索
- Markdown操作之表格操作(插入,单元格内换行,居左、居右、居中)
- Ubuntu 20.04切换软件源为清华源
- VC++编写电子邮件程序 第二篇 也是用simple mapi
热门文章
- document.elementFromPoint
- .NET 6 使用 Obfuscar 进行代码混淆
- ASP.NET Core Web API使用静态swagger.json文件
- 如何编写干净流畅的Web API测试
- .Net Core with 微服务 - 使用 AgileDT 快速实现基于可靠消息的分布式事务
- Asp.NET Core 中如何加密 Configuration ?
- Magicodes.IE.AspNetCore之一行代码多格式导出
- 腾讯二面挂了,就因为这个...
- OneOfT1,…,Tn清新
- IdentityServer4系列 | 混合模式