C#一定比C++性能差?当然不!破除迷信,从我做起!
几乎所有的程序员在初学编程之时,都被灌输过“托管语言(Java、C#)性能比非托管语言(C、C++)差好多” 的迷信教条。如果你问他们为什么,他们一定会说:托管语言需要通过虚拟机或JIT编译器对中间语言进行解释,会耗费更多的内存和CPU运算时间,而非托管语言则会被直接编译成本地代码,可以直接运行,省去了大量运算。
那么,事实真的是这个样子吗?当然不是!
持以上论调的程序员一般分两类:一类是用C、C++起家的工程师,他们从来没有用过托管语言,也没有深入了解过相关原理,对托管语言的运行机制有一些误解;还有一类是低级程序员,他们不了解程序编译原理,读不懂也不想读相关的书籍,只是觉得非托管语言很难,会用非托管语言的一定是大神,大神说的肯定是对的。然而,其实很多C、C++工程师想转Java、C# 并不比Java、C#工程师转C、C++容易多少,因为两类语言的编程思想完全不一样,想要转变是非常困难的。
言归正传,为什么我说托管语言的性能不一定比非托管语言低呢?
首先要承认, JIT编译的确会耗费更多的运算时间(相对于本地代码),但这不代表本地代码一定比托管代码性能更好。
中间代码的确是需要JIT编译器在运行时进行解释,翻译成本地代码运行的,这也是很多人产生误解的地方。中间代码的存在是保证程序跨平台运行的核心机制,中间代码可以使得开发人员不再关注自己使用的语言,也不再关注程序运行的目标平台,不论开发者使用VB.NET还是C#,不论程序是要运行在x86平台、x64平台、安腾平台或者ARM平台,不论程序是要运行在Windows XP、Windows 10 还是Linux,开发者都不需要修改自己的代码,真正做到一次编写,多平台运行。虽然C、C++也能实现,但是却有很大的局限性,这个后面会说。
但是,中间代码会造成性能下降吗?会!但是完全可以忽略,甚至在某些时候JIT要比本地代码性能更好。
一方面,微软在JIT编译器中做了多种优化,包括本地代码的缓存机制、分支预测,对于客户端程序,微软还提供了NGen工具,可以将中间代码一次性编译成本地代码;对于服务器程序,在第一次加载程序池时,JIT就已经把所有中间代码解释完成了。所以,如果说性能低,主要表现也就是程序的启动速度会慢一丢丢,运行起来以后就几乎没有影响了。所以说这种影响是可以被忽略的。
但是,就算是客户端应用,微软也建议开发者要做性能测试,然后在判断是否要在生产环境中使用NGen工具优化代码。因为在绝大部分情况下,本地代码的性能甚至要比中间代码还要差!
这里就要简单介绍一下JIT编译器的优势了。对于想C、C++这样的语言,会被编译器直接编译成机器语言,但是由于运行环境不确定,特别是CPU指令的差异。这些差异在编译时都要考虑进去才能保证兼容性。而JIT编译器则可以根据程序所在的平台,使用不同的解释方案,能够最大程度的利用平台的优秀特性,对性能会有很大的提升。
在Jeffery Richter所著的《CLR via C#》中,对JIT的运行原理有详细的叙述,以下是一些摘要:



C#一定比C++性能差?当然不!破除迷信,从我做起!的更多相关文章
- 查询Oracle性能差的、正在执行或执行过的SQL语句
查找前十条性能差的sql. SELECT * FROM (select PARSING_USER_ID,EXECUTIONS,SORTS, COMMAND_TYPE,DISK_READS,sql_te ...
- Rreplication 性能差(转储200万门诊处方zjysb012)
ETLDB性能差(HIS转储200万门诊处方zjysb012) 解决方法: 1.禁用cdc.Hismz_capture 2.停止cdc.Hismz_capture 3.关闭zjysb012,zjysb ...
- 分分钟解决MySQL查询速度慢与性能差
阅读本文大概需要 6 分钟. 一.什么影响了数据库查询速度 1.1 影响数据库查询速度的四个因素 1.2 风险分析 QPS: QueriesPerSecond意思是“每秒查询率”,是一台服务器每秒能够 ...
- 分分钟解决 MySQL 查询速度慢与性能差
一.什么影响了数据库查询速度 1.1 影响数据库查询速度的四个因素 1.2 风险分析 QPS: QueriesPerSecond意思是“每秒查询率”,是一台服务器每秒能够相应的查询次数,是对一个特定的 ...
- EF性能分析(一):动态SQL性能差.从OrderBy开始分析
1. 问题背景 在我的力推下,部门业务开发转向ABP,其中ORM采用的是EntityFrameworkCore. 然而,在数据查询方面,出现了重大的性能问题... 请看代码: //在一个百万数据量的表 ...
- 专业解决 MySQL 查询速度慢与性能差!
Java技术栈 ,一般把连接数设置得大一些). 并发量:同一时刻数据库服务器处理的请求数量 3.超高的 CPU使用率:CPU资源耗尽出现宕机. 4.磁盘 IO:磁盘 IO性能突然下降.大量消耗磁盘性能 ...
- 恕我直言你可能真的不会java第6篇:Stream性能差?不要人云亦云
一.粉丝的反馈 问:stream比for循环慢5倍,用这个是为了啥? 答:互联网是一个新闻泛滥的时代,三人成虎,以假乱真的事情时候发生.作为一个技术开发者,要自己去动手去做,不要人云亦云. 的确,这位 ...
- LIMIT和OFFSET分页性能差!今天来介绍如何高性能分页
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. GreatSQL是MySQL的国产分支版本,使用上与MySQL一致. 前言 之前的大多数人分页采用的都是这样: SELEC ...
- 凭借对KMP算法的了解,用java实现了一下,结果和java自带的字符串indexOf比,性能差了十倍。。。
public class KMP { private char[] source = {'a','b','c','b','c','a','b','a','b','d','d','e','f','g', ...
随机推荐
- [oracle]Oracle角色管理
假如我们直接给每一个用户赋予权限,这将是一个巨大又麻烦的工作,同时也不方便DBA进行管理.通过采用角色,使得: 权限管理更方便.将角色赋予多个用户,实现不同用户相同的授权.如果要修改这些用户的权限,只 ...
- Repository 设计模式介绍(转)
在DDD设计中大家都会使用Repository pattern来获取domain model所需要的数据. 1.什么事Repository? "A Repository mediates b ...
- 搭建自己的BT下载平台服务器
[原理基础] BT(Bit Torren比特流)是由国外的一名叫Bram Cohen的程序员开发的下载软件,可以说它是目前网络是非常流行的一个多点下载的P2P软件,它最显著的特点就是:下载的人越多,速 ...
- 互信息应用于SNP特征选择的局限
互信息已广泛应用于特征选择问题,但应用在 SNP 选择上还存在着一些局限.第一,互信息只能衡量一个 SNP 组合与表型的相关性, 无法衡量多个 SNP 与表型的相关性.第二, 利用互信息排序 SNP ...
- IE6中让png的icon图标也透明的完整代码段
一个引用了在IE6中让img图标也可引用png图片的js插件代码的html是这样写的,兼容IE6: <a class="btn btn-select" href=" ...
- Angular - - angular.uppercase、angular.lowercase、angular.fromJson、angular.toJson
angular.uppercase 将指定的字符串转换成大写 格式:angular.uppercase(string); string:被转换成大写的字符串. 使用代码: var str = &quo ...
- iOS 之 Aggregate Target
工程导航栏>选中工程>菜单File>New>Target>Other>Aggregate
- [QT]简单介绍一下 *.pro、*.pri、*.prf、*.prl等四种文件
转自:http://blog.csdn.net/dbzhang800/article/details/6348432 简单介绍一下 *.pro.*.pri.*.prf.*.prl等四种文件:干嘛用的, ...
- Delphi中String类型原理介绍
Delphi中字符串的操作很简单,但幕后情况却相当复杂.Pascal传统的字符串操作方法与Windows不同,Windows吸取了C语言的字符串操作方法.32位Delphi中增加了长字符串类型,该类型 ...
- LNMP 快速安装
网址是:http://lnmp.org/install.html 值得注意的是:它基本上把所有的扩展都装上了,有点冗余 安装完成后,根目录的位置是 /home/wwwroot/default LNMP ...