几乎所有的程序员在初学编程之时,都被灌输过“托管语言(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. iOS 开发 之 编程知识点

    iOS 创建和设置pch iOS 之 时间格式与字符串转换 iOS 之 二维码生成与扫描(LBXScan) iOS 之 定时器 iOS 之 通知 iOS 之 NSString 去除前后空格和回车键 i ...

  2. delphi DBgrid应用大全

    Delphi 语言的数据库编程中,DBGrid 是显示数据的主要手段之一.但是 DBGrid 缺省的外观未免显得单调和缺乏创意.其实,我们完全可以在我们的程序中通过编程来达到美化DBGrid 外观的目 ...

  3. jQuery插件Flot实战Demo

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  4. javaweb入门实例---servlet例子

    1.编写servlet: TreeDataServlet.java package com.maggie.tree; import java.io.IOException; import javax. ...

  5. JSP userBean setProperty getProperty指令使用

    JSP userBean setProperty getProperty指令使用 javaBean的属性取决于get/set方法,而不是真实的属性名称. jsp文件: <%@ page lang ...

  6. CRtmpServer分析与应用

    CRtmpServer分析与应用 官方地址:http://www.rtmpd.com/ CRtmpServer是一款不错的开源流媒体服务器,用c++语言编写,跨平台.官方介绍CRtmpServer不仅 ...

  7. ReentrantLock获取、释放锁的过程

    看了篇文章,觉得分析得很透彻,其后总结的很到位,地址:http://www.iteye.com/topic/1083832 把获取与释放操作串在一起在简单看一下: 获取锁的时候将当前线程放入同步队列, ...

  8. FindPkgConfig----CMake的pkg-config模块

    FindPkgConfig A pkg-config module for CMake. CMake的pkg-config模块. Finds the pkg-config executable and ...

  9. 体验 WebFont,网页上的艺术字

    在最新项目中,由于要频繁使用艺术字, 而用户设备没有此字体,因此以往的经验都是使用图片... 所以在同事的瞩目期许之下,我开始实验研究这个问题的解决方案1. 直接使用字体文件 @font-face { ...

  10. FMDB的简单用法

    使用cocoaPods将FMDB下载到工程 第一步:引入框架,引入支持类库(libsqlite3.0.tbd) #import <FMDB.h> 声明属性 @interface ViewC ...