为什么 c++ 比 java 运行的速度快

3 篇文章 0 订阅

最近和同学讨论算法题目的时候,突然讲到为什么 java 的速度比 c++ 慢,当时一知半解,雾里看花。
于是回来之后查了一下资料,整理一下放在这里,方便以后查看。
暂时理解到这个程度,如果以后有新的理解再做补充。

明确原则

首先,我们要明确一个放之世界皆准的原则:

在资源一定的情况下,鱼与熊掌不可得兼。

在程序运行方面,也就是说效率和便捷性往往不能同时满足。

c++ 和 java 的比较就是一个很典型的例子。java 的抽象层级要比 c++ 高一点,很多情况下 java 语言已经替我们做出了选择(可能是考虑了全局的程序性能之后得到的最优解),所以用起来就比较方便,但是这就有可能放弃了对于某些特定问题的更优的选择(可能他们仅仅在某几类问题上性能优秀,但是全局所有问题来看不是那么理想)也就在一定程度上损失了效率。

比如我们在使用 java 语言的时候可以直接通过 obj.method () 这种方式进行调用,它默认传递的都是引用。但是我们如果使用的是 c++,那么就需要自己来确定我们的方法参数传的是指针还是引用,根据不同的选择在方法内部也有不同的使用方式。

原因浅析

编译过程不一样

在前面我们已经介绍过 c++ 的编译过程,g++ 编译器可以直接将我们的源码编译成为机器可以执行的二进制代码(机器指令的集合),从而直接执行。

而对于 java 语言,java 编译器会将 java 源码解析成字节码(独立于 CPU 架构,cpu 不认识),然后字节码会被 JVM 加载然后再编译成当前 cpu 架构所对应的二进制代码(机器指令的集合)然后再执行。

简而言之,java 在源码与机器指令之间又加了一层字节码的处理,这样可以保证在不同的机器上运行,但是相比于 c++ 直接编译到机器指令来讲就会慢很多。

对象的创建不同

在 java 中一切皆对象(这里忽略基本数据类型的情况),而对象的创建是通过 new 来实现的,也就是说对象本身都是保存在堆内存中的,而栈内存中仅仅保存了一个对象的引用。这样在获得对象的时候实际上可以认为是间接寻址,速度就会比较慢。

而在 c++ 中,很多局部变量和对象的创建都是保存在栈中的,可以直接访问,所以效率就会很高。

检查机制不同

java 虚拟机本身在运行时会对程序进行很多的检查,比如说检查数组越界,检查类型是否错误,检查是否空指针,检查对象是否需要回收 (JVM) 等等,比较充分的保证了 java 程序的安全性和稳定性,但是也浪费了检查的时间。

但是在 c++ 程序中,这些检查都是需要程序员自己进行检查判断和处理的,如果程序员不写,那就硬着头皮执行,所以效率会很高,但是安全性和稳定性会有一定的损失。

参考

  1. java 运行速度比 C++ 慢的原因
  2. 知乎 - 为什么说 Java 比 C / C++ 慢?
  • 10
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值