没有输出的输入是不完整的

0%

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

最近和同学讨论算法题目的时候,突然讲到为什么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++ 慢?