java和c++效率的对比,本质就是即时编译器和静态编译器的对比。
即时编译器有以下缺点
第一、占用的是用户程序运行时间,提供的优化手段受制于编译成本。如果编译速度达不到要求,用户会感觉到重大延迟导致即时编译器不敢引入大规模优化技术。
第二、java是动态类型安全语言,这就意味着需要由虚拟机来确保不会违反语言语义或访问非机构化内存。意味着虚拟机必须频繁检查,访问方法时空指针,数组越界。对于这类程序没有明确写成检查行为,尽管编译器会努力去优化但是还是会占用不少时间。
第三、java没有使用virtuanl关键字但是使用虚方法频率远高于c++,多态选择频率远远高于c++,即时编译器进行一些优化的难度远远高于c++的静态编译器。
第四、java语言是可以动态扩展的语言,运行时可以加载新的类改变继承关系,这使得全局优化都难以进行,许多全局优化只能以激进优化的方式来完成,编译器不得不时刻注意
并随着类型的变化而撤销或者重新进行一些优化。
第五、java语言的对象只能在堆中分配,只有方法局部变量才能在栈上分配,而c++对象有多种内存分配方式既可能在堆内存分配也可能在栈内存分配,栈上分配线程私有可以降低内存回收压力。c++中主要由用户回收内存不用进行无用对象筛选,因此效率比垃圾收集机制要高。
上面一堆的java的劣势就是为了换取开发效率上的优势,动态安全,动态扩展,垃圾回收这些拖后腿的为java语言的开发效率做出了巨大贡献
许多java即时编译器可以做的并且做好的,c++静态编译器做不好,别名分析、类型安全。只要classA,classB没有继承关系,他们绝对不会指向同一块内存,确定classA,classB不是同一个对象后许多优化操作才可以进行,重排、变量代换。java的另外一个红利优势是动态性带来的,c/c++编译器所有优化都是在编译器期间完成,以运行期性能监控基础的优化措施它无法进行预测,如调用频率预测,分支频率预测、裁剪未被选择分支这些都是java语言的独有性能优势。
原文:https://www.cnblogs.com/xiaofeiyang/p/11974757.html