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

一、.net core简介

1.net是什么

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

2)什么是.net core

    .netcore 是一个通用开发平台,由 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:用来选取并执行对应运行时,提供组件载入原则,以及启动.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相关的如WPFsliverlight都不支持;

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

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

  • 平台:.net Framework只支持 Windows,而netcore跨平台,支持macOSLinux

  • 开源:.netcore属于开放源,而.net Framework 的只读子集属于开放源。

2)与 Mono 的主要差异在于

  • 应用模型:Mono 通过 Xamarin 产品支持 .net Framework 应用模型(例如,Windows Forms)和其他应用模型(例如,Xamarin.iOS)的子集。 而 .netcore不支持这些内容;

  • APIMono 使用相同程序集名称和组成要素支持 .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#在内)之后,微软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#还是比较“省钱”的。

 

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

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

原文地址:https://km.tencent.com/openkm/url/q4blcn


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/327502.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《微软开源跨平台移动开发实践》团购通知

【新书推荐】《微软开源跨平台移动开发实践》带你走近微软开源开源跨平台技术 大家的响应非常积极,接近400位同学想团购。 这两天通过作者李争的努力,为大家争取到了非常实惠的价格,投票结果看不到具体是谁参与了投票,请参与投票的…

Invalid character found in the request target. The valid characters are defi

解决Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 问题 ApiOperation(value "根据排污口类型获取所有企业排污口信息和经度和纬度", notes "获取所有企业排污口信息和经度和纬度") PostMappin…

大咖微课 | 直面Angular2系列课第二期开讲

1.背景介绍:Angular1.x与Angular2 近年来,Web 开发技术的发展日新月异,各种框架层出不穷。在这样的大背景之下,2010年10月,Google 首次发布了自己的 Web 开发框架,名为 AngularJS,也叫 Angular&…

HashMap在java并发中如何发生死循环

转载自 HashMap在java并发中如何发生死循环 在多线程环境中,使用HashMap进行put操作时会引起死循环,导致CPU使用接近100%,下面通过代码分析一下为什么会发生死循环。 首先先分析一下HashMap的数据结构:HashMap底层数据结构是有一…

计算机和影视结合专业,计算机专业专业建设总结与典型案例2.5微电影拍摄与后期制作(影视拍摄与后期制作技术)课....

计算机专业专业建设总结与典型案例2.5微电影拍摄与后期制作(影视拍摄与后期制作技术)课. (11页)本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦!9.9 积分微电影拍摄与后期制作(影视拍摄与后期制作技术)…

SpringBoot +Vue前后端分离(笔记)

前后端分离简介 前后端分离 前后端分离就是将⼀个应⽤的前端代码和后端代码分开写,为什么要这样做? 如果不使⽤前后端分离的⽅式,会有哪些问题? 传统的 Java Web 开发中,前端使⽤ JSP 开发,JSP 不是由后…

.NET Core下使用gRpc公开服务(SSL/TLS)

一、前言 前一阵子关于.NET的各大公众号都发表了关于gRpc的消息,而随之而来的就是一波关于.NET Core下如何使用的教程,但是在这众多的教程中基本都是泛泛而谈,难以实际在实际环境中使用,而该篇教程以gRpc为主,但是使用…

HashMap jdk1.7源码阅读与解析

转载自 HashMap源码阅读与解析 一、导入语 HashMap是我们最常见也是最长使用的数据结构之一,它的功能强大、用处广泛。而且也是面试常见的考查知识点。常见问题可能有HashMap存储结构是什么样的?HashMap如何放入键值对、如何获取键值对应的值以及如何…

java实现加密电话号码,有具体的加密流程注释

闲着没事做,正好有一位哥们让帮他看个写个逻辑题,我就顺便写了下! 此题主要是加密一个数字类型的电话号码,具体加密流程如下: * 将一串数字进行加密 * 加密规则:先把这串数字降序,然后将每个…

.NET项目版本号的小随笔

【题外话】 一直以来都对.NET项目中的几个版本号(AssemblyVersion、AssemblyFileVersion、AssemblyInformationalVersion)以及版本号中的Revision和Build有疑问,今儿抽了点时间看了几篇文章,整理一下与大家一起分享下。 【一、Ass…

Windows.etc\hosts文件

Windows.etc\hosts文件 ZC:就是将 后面的项 重定位到 前面的项 1、目录:"C:\Windows\System32\drivers\etc" 文件:"C:\Windows\System32\drivers\etc\hosts" 2、c__Windows_System32_drivers_etc_hosts的作用 - Sharpe…

java实现邮件发送准备工作(前期配置)

本文主要用的邮件客户端是:office 2007的outlook,服务器是apache-james-2.3.2,首先我们来配置一下这个james服务器: 1.将james服务器解压到硬盘目录下,注意目录不能有中文,如e:盘下 2.修改apps/james/sar-inf目录下的confi…

win10关闭“Windows安全中心”功能的两种方法

win10系统怎么将windows安全中心关闭? 听语音 原创|浏览:10407|更新:2020-03-24 10:541 2 3 4 5 6 7 分步阅读 一些软件需要将Windows安全中心关闭。 方法/步骤 1 首先打开开始菜单。 2 在开始菜单中点击设置按钮。 3 在设置界…

ASP.NET Core 中间件Diagnostics使用

ASP.NET Core 中间件(Middleware)Diagnostics使用。对于中间件的介绍可以查看之前的文章ASP.NET Core 开发-中间件(Middleware)。 Diagnostics中间件,主要功能是用于报告和处理ASP.NET Core中的异常和错误信息,以及诊断Entity Framework核心迁移错误。 其…

使用java底层实现邮件的发送(含测试,源码)

直接上代码:3个类,两个主要的类,一个测试类: 主类(Mail): /** * Title: Mail.java * Package org.service.impl * Description: TODO该方法的主要作用: * author A18ccms A18ccms_…

Java多线程:线程状态

转载自 Java多线程:线程状态 一. 线程状态类型 1. 新建状态(New):新创建了一个线程对象。 2. 就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行…

Win10怎么关闭开机启动项

Win10怎么关闭开机启动项 我们可以首先打开电脑的运行对话框,按下键盘的WINR组合键,打开运行。 然后这里我们在运行对话框中输入命令msconfig确定,打开系统配置程序。 系统配置窗口,启动里面点击这里的任务管理器打开。 这时…

TypeScript 2.1发布

TypeScript是微软开发的一个JavaScript的超集,提供了最新的JavaScript特性以及可选的静态类型。近日,TypeScript 2.1发布。该版本提供了功能更为强大的类型检查器,并且让开发人员可以编写出更简洁的代码。以下是该版本带来的主要新特性&#…

使用spring实现邮件的发送(含测试,源码,注释)

此篇主要讲的是使用spring配置实现邮件发送,与之前的底层实现简便了不少,只需要几个配置就可以了,那么请往下看: 先写个接口 /** * Title: IMailserdService.java * Package org.service * Description: TODO该方法的主要作用&a…

你当前无权访问该文件夹 解决你当前无权访问该文件夹拒绝你访问该文件夹

我 这样就完成了 http://www.xitonghe.com/jiaocheng/windows7-5642.html https://jingyan.baidu.com/article/4b52d702aa01b3fc5c774b1b.html Win10正式版提示你当前无权访问该文件夹怎么办 https://jingyan.baidu.com/article/4b52d702aa01b3fc5c774b1b.html 1407345人看了…