最近看到有人发了个挨骂的帖子,讲的是java的jit编译器优化出来的代码比C++的要快,自然骂者甚众。
实际上这种可能是存在的,用gcc编译器做了点小测试,发现再怎么优化也不能生成一些新的P6指令(可能是我没掌握技巧吧),比如条件传送指令(CMOVxx)没生成出来。我想它可能是为了兼容性吧,只生成兼容大多数CPU的指令,不知道把它能不能针对特定平台优化指令。
java的jit可以避免这样的兼容性问题,它在运行时才编译成机器码,自然可以生成优化指令,估计那些测试也是这么比较出来的。说它编译出来的代码比c++编译器生成的要快,我想是完全可能的,使用某些平台特定的指令可以加快执行速度。大部分C++编译器生成的都是通用指令,虽然换一台机器也可以执行,但是绝对不是效率最高的。
仅仅这一点不能说明java更快,别忘了,java虚拟机还要做很多别的事。也就是说,虽然生成的代码效率可能更高,但在其它方面会把速度拖慢下来。
既然jit有这样的优点,为何C++不把它吸收过来呢?先生成中间代码,在程序启动时生成优化代码。。。