java与c/c++的编译器对比

大多数程序员都认为C/C++比java快,这种观点是由于java刚出现的时候即时编译技术还不成熟,主要靠解释器执行的java语言性能比较低下。
现在的即时编译技术已经成熟,下面对java和C/C++的速度进行讨论。
java与C/C++的编译器对比实际上代表了最经典的即时编译器与静态编译器的对比。
java虚拟机的即时编译器与C/C++的静态优化编译器相比,由于以下原因导致输出的本地代码有一些劣势

1、

即时编译器运行占用的是用户程序的运行时间,具有很大的时间压力,且优化手段也严重受制于编译成本。编译速度若不能达到要求,用户在启动程序时就能感觉到重大延迟。而编译的时间成本在静态优化编译器中并不是主要的关注点。

2、

java语言是动态的类型安全语言,意味着由虚拟机来确保程序不会违反语言语义或访问非结构化内存。从实现层面上看,意味着虚拟机必须频繁的进行动态检查,需要消耗不少的运行时间。

3、

java预言师可以动态扩展的语言,运行时加载新的类可能改变程序类型的继承关系,使得很多全局的优化很难进行。使得编译器不得不时刻注意并随着类型的变化而在运行时撤销或重新进行一些优化。

4、

java语言中对象的内存分配都在堆上进行,只有方法中的局部变量才能在栈上分配。而C/C++的对象择优多种内存分配方式,堆上或栈上。除此之外,C/C++主要有用户程序代码来回收分配的内存,不存在无用对象的筛选过程,效率上比垃圾收集机制要高。

总结:
java语言这些性能上的劣势都是为了换区开发效率上的优势而付出的代价。动态安全、 动态扩展、 垃圾回收 这些特性都为java语言的开发效率做出了很大的贡献。