几乎所有的程序员在初学编程之时,都被灌输过“托管语言(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++性能差?当然不!破除迷信,从我做起!的更多相关文章

  1. 查询Oracle性能差的、正在执行或执行过的SQL语句

    查找前十条性能差的sql. SELECT * FROM (select PARSING_USER_ID,EXECUTIONS,SORTS, COMMAND_TYPE,DISK_READS,sql_te ...

  2. Rreplication 性能差(转储200万门诊处方zjysb012)

    ETLDB性能差(HIS转储200万门诊处方zjysb012) 解决方法: 1.禁用cdc.Hismz_capture 2.停止cdc.Hismz_capture 3.关闭zjysb012,zjysb ...

  3. 分分钟解决MySQL查询速度慢与性能差

    阅读本文大概需要 6 分钟. 一.什么影响了数据库查询速度 1.1 影响数据库查询速度的四个因素 1.2 风险分析 QPS: QueriesPerSecond意思是“每秒查询率”,是一台服务器每秒能够 ...

  4. 分分钟解决 MySQL 查询速度慢与性能差

    一.什么影响了数据库查询速度 1.1 影响数据库查询速度的四个因素 1.2 风险分析 QPS: QueriesPerSecond意思是“每秒查询率”,是一台服务器每秒能够相应的查询次数,是对一个特定的 ...

  5. EF性能分析(一):动态SQL性能差.从OrderBy开始分析

    1. 问题背景 在我的力推下,部门业务开发转向ABP,其中ORM采用的是EntityFrameworkCore. 然而,在数据查询方面,出现了重大的性能问题... 请看代码: //在一个百万数据量的表 ...

  6. 专业解决 MySQL 查询速度慢与性能差!

    Java技术栈 ,一般把连接数设置得大一些). 并发量:同一时刻数据库服务器处理的请求数量 3.超高的 CPU使用率:CPU资源耗尽出现宕机. 4.磁盘 IO:磁盘 IO性能突然下降.大量消耗磁盘性能 ...

  7. 恕我直言你可能真的不会java第6篇:Stream性能差?不要人云亦云

    一.粉丝的反馈 问:stream比for循环慢5倍,用这个是为了啥? 答:互联网是一个新闻泛滥的时代,三人成虎,以假乱真的事情时候发生.作为一个技术开发者,要自己去动手去做,不要人云亦云. 的确,这位 ...

  8. LIMIT和OFFSET分页性能差!今天来介绍如何高性能分页

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. GreatSQL是MySQL的国产分支版本,使用上与MySQL一致. 前言 之前的大多数人分页采用的都是这样: SELEC ...

  9. 凭借对KMP算法的了解,用java实现了一下,结果和java自带的字符串indexOf比,性能差了十倍。。。

    public class KMP { private char[] source = {'a','b','c','b','c','a','b','a','b','d','d','e','f','g', ...

随机推荐

  1. wukong搜索引擎源码解读

    转自:https://ayende.com/blog/171745/code-reading-wukong-full-text-search-engine I like reading code, a ...

  2. 避免Node.js中回调地狱

    为了解决这个阻塞问题,JavaScript严重依赖于回调,这是在长时间运行的进程(IO,定时器等)完成后运行的函数,因此允许代码执行经过长时间运行的任务. downloadFile('example. ...

  3. XML 特殊字符处理和 CDATA

    在处理XML数据时,特殊字符要特殊处理,不能和节点字符混淆. 所有 XML 文档中的文本均会被解析器解析. 只有 CDATA 区段(CDATA section)中的文本会被解析器忽略. PCDATA ...

  4. 使用(Drawable)资源———ClipDrawable资源

    ClipDrawable代表从其他位图上截取的一个"图片片段".在XML文件中定义ClipDrawable对象使用<clip.../>元素,该元素的语法为: <? ...

  5. GridView等表格模板列绑定数据的方法

    //绑定GridView每一行中的CheckBoxList protected void GridView1_RowDataBound(object sender, GridViewRowEventA ...

  6. jQuery基本过滤选择器

    jQuery基本过滤选择器: <h1>this is h1</h1> <div id="p1"> <h2>this is h2< ...

  7. pureMVC简单示例及其原理讲解四(Controller层)

    本节将讲述pureMVC示例中的Controller层. Controller层有以下文件组成: AddUserCommand.as DeleteUserCommand.as ModelPrepCom ...

  8. [心得]传统IT转互联网面试经验分享

    http://www.newsmth.net/bbstcon.php?board=Java&gid=374779 传统IT外企干了8年,两年前转互联网的,面的和被面的都不少.这几天项目空档期, ...

  9. C++中的trivial解释

    Trivial default constructor The default constructor for class T is trivial (i.e. performs no action) ...

  10. apache软件包下载地址

    主地址: http://commons.apache.org/proper/commons-loggins/download_logging.cgi 镜像1: http://apache.fayea. ...