一、.net core简介

1.net是什么

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

2)什么是.net core

.netcore是一个通用开发平台,由MicrosoftGithub共同维护。 它是跨平台的,支持WindowsmacOSLinux,并且可用于设备、云和嵌入式/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

目前不支持ARM64ARM32

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%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#在内)之后,微软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.2xlarge2.3 GHz Intel Xeon® E5-2686 v48G+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++团队成本约为861WC#团队成本为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跨平台或扫描二维码关注

赞赏

人赞赏

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

  1. 前端老弟第一次写后端,崩了!

    幽默轻松小知识,一起来看看老弟第一次写的后端代码,你觉得如何? 大家好,我是鱼皮,今天分享我的老弟第一次写后端代码时出现的囧事,希望大家引以为戒. 孽起 我的老弟小阿巴,目前大一,自学编程有一段时间了 ...

  2. 给 asp.net core 写个中间件来记录接口耗时

    给 asp.net core 写个中间件来记录接口耗时 Intro 写接口的难免会遇到别人说接口比较慢,到底慢多少,一个接口服务器处理究竟花了多长时间,如果能有具体的数字来记录每个接口耗时多少,别人再 ...

  3. 给 asp.net core 写一个简单的健康检查

    给 asp.net core 写一个简单的健康检查 Intro 健康检查可以帮助我们知道应用的当前状态是不是处于良好状态,现在无论是 docker 还是 k8s 还是现在大多数的服务注册发现大多都提供 ...

  4. 手把手教你用.NET Core写爬虫

    写在前面 自从上一个项目58HouseSearch从.NET迁移到.NET core之后,磕磕碰碰磨蹭了一个月才正式上线到新版本. 然后最近又开了个新坑,搞了个Dy2018Crawler用来爬dy20 ...

  5. 一张我为写植物大战僵尸外.挂而画的草稿图...

    一张我为写植物大战僵尸外.挂而画的草稿图... 呵呵,为了以后复习方便,写篇文章以记之...

  6. 用php写后端怎么使用模板_用PHP保守秘密

    用php写后端怎么使用模板 Introduction 介绍 People have always sought ways to keep secrets from prying eyes or to ...

  7. python写后端提供api_python写后端api

    有没有大神分享一个纯python无框架写的webapi后端...python自学完了,想写个api练练手,CSS布局HTML小编今天和大家分享个案例代码来借鉴借鉴精华 你可能有误解,无框架要比使用框架 ...

  8. 手把手教你用.NET Core写爬虫 1

    写在前面 自从上一个项目58HouseSearch从.NET迁移到.NET core之后,磕磕碰碰磨蹭了一个月才正式上线到新版本. 然后最近又开了个新坑,搞了个Dy2018Crawler用来爬dy20 ...

  9. Base: ACID外的另外一种选择

     Base: ACID外的另外一种选择 在分区数据库中,为可用性牺牲一定的一致性能够显著提高可扩展性 DAN PRITCHETT, EBAY 在过去的十年中,Web应用变得日益流行.无论您是为最终 ...

最新文章

  1. 行式填报表轻松搞定流水号
  2. 吴恩达深度学习笔记7-Course2-Week3【超参数调试、Batch 正则化和程序框架】
  3. php绘图效率,对于PHP绘图技术的理解
  4. 鼠标经过图片抖动效果
  5. 人生路漫漫,还得多输出
  6. 【转载】Weka入门教程
  7. Python分析热门话题“不生孩子的人后来都怎么了”,看看丁克家庭最后都怎么样了...
  8. setcellvalue 格式_Java Cell.setCellValue方法代码示例
  9. 集备二Linux部署之FTP
  10. hightcharts 如何修改legend图例的样式
  11. java反射 获取方法_java反射——获取类的方法信息
  12. 原来 GitHub 网红是这么混出来的 如何以正确的姿势参与开源项目
  13. P5556 圣剑护符 题解
  14. 浅谈深度学习:基于对LSTM项目`LSTM Neural Network for Time Series Prediction`的理解与回顾
  15. 如何在unity使用数据库
  16. JavaWeb学习-案例练习-图书管理前台-9-分页功能实现
  17. 车联网赋能末端物流自动驾驶探索
  18. Markdown操作之表格操作(插入,单元格内换行,居左、居右、居中)
  19. Ubuntu 20.04切换软件源为清华源
  20. VC++编写电子邮件程序 第二篇 也是用simple mapi

热门文章

  1. document.elementFromPoint
  2. .NET 6 使用 Obfuscar 进行代码混淆
  3. ASP.NET Core Web API使用静态swagger.json文件
  4. 如何编写干净流畅的Web API测试
  5. .Net Core with 微服务 - 使用 AgileDT 快速实现基于可靠消息的分布式事务
  6. Asp.NET Core 中如何加密 Configuration ?
  7. Magicodes.IE.AspNetCore之一行代码多格式导出
  8. 腾讯二面挂了,就因为这个...
  9. OneOfT1,…,Tn清新
  10. IdentityServer4系列 | 混合模式