但是也需要清楚,在某些时候,JAVA速度更快。这是建立在C++还没有精通或者不想花时间优化的前提下。JAVA的虚拟机有时非常智能,它可以自动对代码进行优化。而C++编译器则优化空间较少,它的哲学是把更多的优化机会留给程序员。
JAVA虚拟机常见的自动优化有以下这些。自动把某些资源放到栈上分配,自动把某些函数设置为内联。还有更厉害的,内存池。采用内存池时(预先分配一大块),内存分配会有一定提速,也防止了内存碎片。还有缓存技术,把一些可能经常用的对象预先分配,以后每次new的时候直接用现成的。也就是表面上看是new了个对象,实际上并没有发生分配内存的动作,而是直接使用全局的一个可以反复重用的对象指针。还有“写时修改”策略。即克隆一个大对象时,并没有真正克隆(仅仅是复制一个指针),而是直到发现新对象变更时才真正克隆。
这些优化,用C++通通都可以做,而且还可以手动做,不依赖编译器自动优化(JAVA通常依赖自动优化,不能手动)。C++要做的就是该栈上分配的就栈上分配,该内联的就内联(内联不了的直接少调用函数,或写成宏)。顺便说一下,JAVA似乎都没有栈上分配(除了基本类型)和内联的概念,因为是靠虚拟机自动智能实现的。更加复杂的就是内存池了,自己实现一个内存池。另外还有多用缓存,不要什么东西都从堆上新分配。
但是现实情况是,多数C++程序员都没有这些优化能力,或者即使有也没有那个时间折腾,赶工期嘛。还有一点很重要,性能优化后的代码往往可读性都很差,而且代码变复杂!这就导致了,在某些时候,类似的代码,JAVA速度反而更快。
最后,还需要强调,上面说的JAVA有时候比C++快,这种情况并不多见。有也是经常发生在C++初学者身上。而且只要是C++代码经过高度的优化,基本上是一定比高度优化的JAVA要快的!
大家可以把C++比喻成有强大功能(光圈,变焦,曝光时间等)的相机,而JAVA是高度智能的一键式傻瓜式相机。当一个不会手动调参的摄影师用专业相机时,并不一定比一键式傻瓜相机自动调参拍出来的效果好。而一个专业摄影师,则一定拍出来比傻瓜式相机效果好。