大多数程序员都认为C/C++会比Java语言快,甚至于觉得从Java语言诞生以来,“执行速度缓慢”的帽子就应当被扣在头顶,这种观点的出现是由于Java刚出现的时候JIT编译技术还不成熟,主要靠解释器执行的Java语言确实性能比较低下。但是在今天JIT编译技术已经发展成熟之后,Java语言有可能在速度上与C/C++争一日长短了吗?这个问题的答案,让我们从两者的编译器谈起。   Java与C/C++的编译器对比实际上是代表了最经典的JIT编译器与静态编译器的对比,也很大程度上决定了Java与C/C++的性能对比的结果,因为无论是C/C++还是Java代码,最终编译之后被机器执行的都是本地机器码,哪种语言性能更高,除了它们自身的API库实现得好坏以外,其余的比较就成了一场“拼编译器”、“拼输出代码质量”的游戏。当然,这种比较也是剔除了开发效率的片面对比,语言间孰优孰劣,谁快谁慢的问题都是很难有结果的争论,下面我们就回到正题,看看这两种语言的编译器各有何优势。   Java虚拟机的JIT编译器与C/C++的静态优化编译器相比,可能会由于下列这些原因导致输出的本地代码有一些劣势(下面列举的也包括一些虚拟机执行子系统的性能劣势):   首先,因为JIT编译器运行占用的是用户程序运行时间,具有很大的时间压力,它能提供的优化手段也严重受制于编译成本。如果编译速度不能达到要求,那用户将在启动程序或程序的某部分察觉到重大延迟,这点使得JIT编译器不敢随便引入大规模的优化技术,而编译的时间成本在静态优化编译器中并不是主要的关注点。   其次,Java语言是动态的类型安全语言,这意味着需要由虚拟机来确保程序不会违反语言语义或访问非结构化内存。在实现层面上看,这就意味着虚拟机必须频繁进行动态检查,如对象实例访问时检查空指针、数组元素访问时检查上下界范围、类型转换时检查继承关系等等。对于这类程序代码没有明确写出的检查行为,尽管编译器会努力进行优化,但是总体上仍然要消耗着不少的运行时间。   Java语言中虽然没有virutal关键字,但是使用虚方法的频率却远远大于C/C++语言,这意味着运行时对方法接收者进行多态选择的频率要远远大于C/C++语言,也意味着JIT编译器在进行一些优化,如方法内联时难度要远大于C/C++的静态优化编译器。   Java语言是可以动态扩展的语言,运行时加载新的类可能改变程序类型继承关系,这使得很多全局的优化都难以进行,因为编译器无法看见程序的全貌,许多全局优化措施都只能以激进优化的方式来完成,编译器不得不时刻注意并随着类型变化而在运行是撤消或重新进行一些优化。   Java语言中的对象内存分配都是堆上进行,只有方法中的局部变量才在栈上分配。而C/C++的对象则有多种内存分配方式,既可能在堆上分配,也可能在栈上分配,如果可以把线程私有的对象在栈上分配,将可以减轻内存回收的压力,也不需要考虑内存屏障方面的问题。另外,C/C++中主要由用户程序代码来回收分配的内存,这就不存在无用对象筛选的过程,因此效率上(仅指运行效率,排除了开发效率)也垃圾收集机制要高。   Java语言相对C/C++的劣势上面说了一大堆,倒不是说Java就真的不如C/C++了,相信大家也注意到了,Java语言的这些性能上的劣势都是为了换取开发效率上的优势而付出的代价,动态安全、动态扩展、垃圾回收这些“拖后腿”特性都为Java语言的开发效率作出了很大贡献。何况,也不见得就没有Java的JIT编译器能做,而C/C++的静态优化编译器不能做的优化:由于C/C++编译器的静态性,以运行期性能监控为基础的优化措施它都无法进行,如调用频率预测(Call Frequency Prediction)、分支频率预测(Branch Frequency Prediction)、裁剪未被选择的分支(Untaken Branch Pruning)等,这些都会形成一些Java语言独有的性能优势。

c比java运行快的原因_C/C++比JAVA快的原因相关推荐

  1. 【java运行报错】Can not set java.lang.String field com.iS.UserEntity.name to java.lang.Class

    [java运行报错]Can not set java.lang.String field com.iS.UserEntity.name to java.lang.Class 原因: 解决办法 总结:仰 ...

  2. java运行时参数_运行时的Java 8参数名称

    java运行时参数 Java 8将引入一种更容易的方法来发现方法和构造函数的参数名称. 在Java 8之前,找到参数名称的方法是在编译阶段打开调试符号,这会在生成的类文件中添加有关参数名称的元信息,然 ...

  3. java 运行时异常 处理_如何在Java中处理运行时异常?

    运行时异常是Java编程语言所有异常的父类,这些异常在发生时会崩溃或崩溃,可能会破坏程序或应用程序.与不被视为运行时异常的异常不同,永远不会检查运行时异常. "运行时异常"通常显示 ...

  4. java c语言语法对比_c语言和java的语法区别是什么

    c语言和java的语法区别是什么 发布时间:2020-06-10 11:53:18 来源:亿速云 阅读:172 作者:Leah c语言和java的语法区别是什么?针对这个问题,今天小编总结这篇有关c语 ...

  5. java c语言语法对比_c语言和java语法有区别吗?

    c语言和java语法有区别吗? c语言和java在语法上有区别,区别是: 1.C语言有指针,java没有指针: C语言的语法比较简单,但是它的亮点指针很容易出错,想要好好的运用指针是件很难的事情,用好 ...

  6. java c语言语法对比_c语言和java语法有区分吗?_后端开发

    c言语和java语法有区分吗? c言语和java在语法上有区分,区分是: 1.C言语有指针,java没有指针: C言语的语法比较简单,然则它的亮点指针很轻易失足,想要好好的应用指针是件很难的事变,用好 ...

  7. android java和c混合编程_C/C++在Java、Android和Objective-C三大平台下实现混合编程

    Android和iOS开发都支持C++开发,可以一套代码多平台使用.同时C++难以反编译的特性也可以为Android开发带来代码的保密,另一native特性也可以提高代码的运行效率. 一.为什么使用C ...

  8. android java和c混合编程_C/C++在Java项目、Android和Objective-C三大平台下实现混合编程...

    Android和iOS开发都支持C++开发,可以一套代码多平台使用.同时C++难以反编译的特性也可以为Android开发带来代码的保密,另一native特性也可以提高代码的运行效率. 一.为什么使用C ...

  9. java运行平台的3个版本,目前 Java 平台主要分为哪3个版本?

    目前 Java 平台主要分为哪3个版本? 更多相关问题 FusionInsight LibrA完全继承了PostgreSQL的用户和角色的. E-105与C-101连通的物料线上各有一手阀. 足够大的 ...

最新文章

  1. D3.js系列——初步使用、选择元素与绑定数据
  2. BZOJ4129: Haruna’s Breakfast
  3. [转]c++之菱形继承
  4. java的reflection机制_Java的Reflection机制
  5. [转]IP动态切换脚本
  6. 使用report PRC_SHOW_PRICING_DOCUMENT查看SAP CRM订单的pricing数据
  7. Leetcode No.146 ****
  8. Js——elementFromPoint方法
  9. __invoke,try{}catch(){},microtime(),is_callable()
  10. CVPR 2019 | 微软亚洲研究院 7 篇精选论文解读
  11. [CF452E]Three strings
  12. 非负矩阵分解 NMF(Non-negative Matrix Factorization )
  13. 7.Magento系统配置(System.xml)
  14. python学习笔记(十二)之函数
  15. 对 n = 2,3,...,300, 判断那些 Mersenne 数 M_n=2^n-1 是素数 | matlab 源码
  16. java代码自动生成,在线生成非常好用收藏
  17. 关于被调函数形参:SqList L、SqList L、SqList *L 的区别
  18. linux下如何查看网卡ip,linux下如何查看某个网卡当前使用的IP
  19. nodejs 连接数据库 并在数据库上进行增删改查操作
  20. 二十一世纪大学英语读写教程学习笔记(原文)——3 - Stevie Wonder: Sunshine in the Shadow(Stevie Wonder——黑暗中的阳光)

热门文章

  1. c语言1000行代码,【图片】【标题党】论我是如何一分钟写1000行代码的【c语言吧】_百度贴吧...
  2. 矢量归一化_7. 从矢量观测到姿态观测
  3. 流程图怎么切换_PPT中「较长的流程图」该如何清晰展现?
  4. 【连载】如何掌握openGauss数据库核心技术?秘诀五:拿捏数据库安全(4)
  5. MySQL修改有存量数据的数据库字符集实战
  6. 风起云涌:传Oracle技术的二号人物 Thomas Kurian 正在离开
  7. 详解用OpenCV绘制各类几何图形
  8. 应用数仓ODBC前,这些问题你需要先了解一下
  9. Python基础语法和数据类型最全总结
  10. 疫情按下快进键,电商抢占市场红利需可靠的助力