`
IcyFenix
  • 浏览: 363718 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
文章分类
社区版块
存档分类
最新评论

请您先登录,才能继续操作

Java与C/C++的性能对比

阅读更多
  写这个主题是因为若干时间前一时头脑发热,写了这个帖子(http://www.iteye.com/topic/857722),现在看来这个帖子很幼稚,尤其是二楼= =#,后来被bugmenot同学抓到:

bugmenot 写道
javacoreSZ 写道
IcyFenix 写道
看看反应如何,好的话明天再写一篇来小淌一下“C/C++会比Java语言快多少多少倍”这浑水,也是这2天由那几张判断字符串能不能用异常的帖子中看到的观点。


这个最好还是别写,坑太大了。
而且他们性能之间的差距并不是由c++ 或 java语言本身所带来的,而是由于他们的实际编译器/虚拟机在做代码生成的时候,对代码优化的程度所带来的。

所以你要写的话,也是要深入各主流cpp编译器来写,写得不好就口水战了。

楼主大大这坑还跳么?小的们还等着学习呢
小的琢磨,“同等开发成本”为前提来比较才有意义。不然C/C++总能写出更高效的


  哼哼,不就踩个坑嘛,我抛块砖头,引点玉出来。请撒迦、bugmenot等同学继续来拍吧 ……

  ========== 上面是废话,下面是正文,我是分割线 ==========

  大多数程序员都认为C/C++会比Java语言快,甚至于觉得从Java语言诞生以来,“执行速度缓慢”的帽子就应当被扣在头顶,这种观点的出现是由于Java刚出现的时候JIT编译技术还不成熟,主要靠解释器执行的Java语言确实性能比较低下。但是在今天JIT编译技术已经发展成熟之后,Java语言有可能在速度上与C/C++争一日长短了吗?这个问题的答案,让我们从两者的编译器谈起。

  Java与C/C++的编译器对比实际上是代表了最经典的JIT编译器与静态编译器的对比,也很大程度上决定了Java与C/C++的性能对比的结果,因为无论是C/C++还是Java代码,最终编译之后被机器执行的都是本地机器码,哪种语言性能更高,除了它们自身的API库实现得好坏以外,其余的比较就成了一场“拼编译器”、“拼输出代码质量”的游戏。当然,这种比较也是剔除了开发效率的片面对比,语言间孰优孰劣,谁快谁慢的问题都是很难有结果的争论,下面我们就回到正题,看看这两种语言的编译器各有何优势。

  Java虚拟机的JIT编译器与C/C++的静态优化编译器相比,可能会由于下列这些原因导致输出的本地代码有一些劣势(下面列举的也包括一些虚拟机执行子系统的性能劣势):

  首先,因为JIT编译器运行占用的是用户程序运行时间,具有很大的时间压力,它能提供的优化手段也严重受制于编译成本。如果编译速度不能达到要求,那用户将在启动程序或程序的某部分察觉到重大延迟,这点使得JIT编译器不敢随便引入大规模的优化技术,而编译的时间成本在静态优化编译器中并不是主要的关注点。

  其次,Java语言是动态的类型安全语言,这意味着需要由虚拟机来确保程序不会违反语言语义或访问非结构化内存。在实现层面上看,这就意味着虚拟机必须频繁进行动态检查,如对象实例访问时检查空指针、数组元素访问时检查上下界范围、类型转换时检查继承关系等等。对于这类程序代码没有明确写出的检查行为,尽管编译器会努力进行优化,但是总体上仍然要消耗着不少的运行时间。

  Java语言中虽然没有virutal关键字,但是使用虚方法的频率却远远大于C/C++语言,这意味着运行时对方法接收者进行多态选择的频率要远远大于C/C++语言,也意味着JIT编译器在进行一些优化,如方法内联时难度要远大于C/C++的静态优化编译器。

  Java语言是可以动态扩展的语言,运行时加载新的类可能改变程序类型继承关系,这使得很多全局的优化都难以进行,因为编译器无法看见程序的全貌,许多全局优化措施都只能以激进优化的方式来完成,编译器不得不时刻注意并随着类型变化而在运行是撤消或重新进行一些优化。

  Java语言中的对象内存分配都是堆上进行,只有方法中的局部变量才在栈上分配。而C/C++的对象则有多种内存分配方式,既可能在堆上分配,也可能在栈上分配,如果可以把线程私有的对象在栈上分配,将可以减轻内存回收的压力,也不需要考虑内存屏障方面的问题。另外,C/C++中主要由用户程序代码来回收分配的内存,这就不存在无用对象筛选的过程,因此效率上(仅指运行效率,排除了开发效率)也垃圾收集机制要高。

  Java语言相对C/C++的劣势上面说了一大堆,倒不是说Java就真的不如C/C++了,相信大家也注意到了,Java语言的这些性能上的劣势都是为了换取开发效率上的优势而付出的代价,动态安全、动态扩展、垃圾回收这些“拖后腿”特性都为Java语言的开发效率作出了很大贡献。何况,也不见得就没有Java的JIT编译器能做,而C/C++的静态优化编译器不能做的优化:由于C/C++编译器的静态性,以运行期性能监控为基础的优化措施它都无法进行,如调用频率预测(Call Frequency Prediction)、分支频率预测(Branch Frequency Prediction)、裁剪未被选择的分支(Untaken Branch Pruning)等,这些都会形成一些Java语言独有的性能优势。
分享到:
评论
2 楼 mercyblitz 2011-04-11  
帖子慢慢看,呵呵!

分析JVM的实现,不能得出,在运行时,还是机器码.

只是Java做了强类型,统一数据结构,这样导致内存开销相对比较大,GC算法也是一个瓶颈。
1 楼 IcyFenix 2011-02-15  
评论远比正文有价值:http://hllvm.group.iteye.com/group/topic/24754

相关推荐

    Android Binder C/C++层实现示例

    四、C/C++ Binder与Java Binder的对比 虽然Java Binder是Android应用开发者更常见的API,但C/C++ Binder提供了更低层次的访问,可以实现更高效、更灵活的进程间通信。Java Binder是C/C++ Binder的封装,提供了面向...

    C、C++、JAVA数据结构与算法电子书

    5. **性能对比**: - **C/C++**:由于直接操作内存,执行效率通常高于Java,但需要谨慎处理内存管理。 - **Java**:运行速度稍慢,但有平台独立性、自动内存管理等优点。 6. **学习资源**: - 书中可能会涵盖...

    C/C++/JAVA/Python代码统计工具

    本文将详细讲解“C/C++/JAVA/Python代码统计工具”,包括其功能、使用方法以及如何进行代码差异统计。 首先,这个工具支持多种编程语言,如C、C++、Java和Python,这些都是广泛应用的编程语言。通过统一的统计方法...

    代码审查表 英文版 通用 JAVA/C/C++

    - **要点说明**:合理利用外部库可以节省开发时间,提高软件性能。 - **审查关注点**:确认是否使用了合适的外部组件或库,并确保其版本兼容性。 **7. 是否存在可以简化为单一程序块的重复代码?** - **要点说明**...

    java和c/c++ 数据类型长度的比较

    本文将深入对比Java和C/C++的数据类型长度,以便更好地理解和利用它们。 首先,让我们来看C/C++的数据类型。C语言提供了多种整数类型,包括char、short、int和long。根据Ansi C的规定,char类型通常代表一个字节,...

    C/C++或Java等程序语言的编辑器

    本文将详细讨论“C/C++或Java等程序语言的编辑器”,并特别聚焦于名为SourceInsight的工具。 首先,我们需要理解编辑器在编程中的角色。编辑器是程序员用于编写、修改和查看源代码的软件工具。它不仅提供了文本输入...

    多语言环境下结构体的定义与应用详解-C/C++/Python/Java结构体实现对比

    内容概要:本文详细介绍了结构体这一用户自定义数据类型的定义与使用方法,分别展示了其在 C、C++、Python 和 Java 四种编程语言中的表现形式及其特点。C语言使用struct关键字来定义并管理相关数据;C++继承了这一...

    Java通过JNI调用C语言函数库的方法.zip

    Java通过JNI(Java Native Interface)调用C语言函数库是一种常见的技术实践,它允许Java程序直接与本地操作系统和硬件交互,提高性能或者利用已有的C/C++代码库。本资料"Java通过JNI调用C语言函数库的方法.zip"提供...

    Java语言与C++语言的对比分析.pdf

    Java语言由Sun Microsystems公司于1995年推出,而C++则源于1983年推出的C语言,由Bjarne Stroustrup开发。两种语言在继承了C语言一些特性的同时,也在面向对象、安全性和平台无关性等方面进行了大量的优化与创新。 ...

    C++与java比较

    相反,C++虽然不具有Java那样的跨平台便捷性,但它具有更广泛的系统级控制,可以更深入地优化性能。C++的通用性和全面性使其成为许多底层系统和高性能应用的首选,因为它允许直接访问硬件资源,提供低级别的内存管理...

    (C/C++/java)朴素的模式匹配(暴力法)算法 数据结构

    本文将深入探讨这个主题,并结合C、C++和Java三种编程语言的实现,来解析其工作原理和应用。 首先,我们来理解朴素模式匹配的基本概念。这种算法是通过对主串(输入字符串)和模式串(要寻找的子串)进行逐字符比较...

    C++与java的综述与比较

    ### C++与Java的综述与比较 #### 引言 C++与Java都是面向对象的编程语言,Java从某种程度上来说是基于C++发展起来的,因此它们之间存在着诸多相似性和差异性。本文旨在对这两种语言进行一个全面的综述,并通过对比...

    java与C++严格的比较.pdf

    《Java与C++严格的比较》这篇文章由Robert C. Martin撰写于1997年,是针对Java与C++这两种流行编程语言之间差异的一次全面探讨。该文不仅对两种语言进行了详细的对比分析,还为那些从Java转向C++或从C++转向Java的...

    面向对象编程C++和Java比较教程

    C++,由Bjarne Stroustrup设计,起源于C语言,是C的增强版,具有底层控制能力和高性能。C++支持类、封装、继承、多态等面向对象特性,并且包含了模板、STL(Standard Template Library)等高级特性,使得它在系统级...

    JNI与JNA性能的比较.docx

    JNI是一种低级别的原生接口,需要编写C/C++代码,并且需要通过`javah`工具生成头文件来定义Java Native方法的C/C++函数原型。JNI的优势在于它直接映射了Java和C/C++的数据类型,提供了高效的数据传递,而且可以完全...

    The diffenences bwtween Java and C++ (JAVA与C++区别)

    根据《C++编程思想》一书的观点,C++与C之间的效率差异往往在正负5%之间,因此,在大多数情况下,C++完全可以替代C语言(特别是在单片机等领域,但需要注意对硬件的直接操作或使用C语言的情况)。 Java是一种广泛...

    C++与Java比较.doc

    ### C++与Java的主要区别及各自优势 #### Java的优势 1. **跨平台性**:Java最著名的特性之一就是它的“一次编写,到处运行”(Write Once, Run Anywhere, WORA)理念,这意味着编写的Java程序可以在任何安装了...

    CH-Java语言程序设计中的若干问题(与“方法”有关文档共86张).pptx

    这份文档“CH-Java语言程序设计中的若干问题(与“方法”有关文档共86张).pptx”显然深入探讨了Java编程语言与C/C++的对比,以及Java特有的编程规则和方法。以下是基于提供的部分内容提炼出的关键知识点: 1. **回顾...

    源代码统计工具,用于统计c/C++,JAVA,JS,XML,JSP等格式代码

    本文将详细讨论这种工具的功能、使用方法及其在C/C++、JAVA、JS、XML和JSP等不同编程语言中的应用。 1. **功能介绍** - **行数统计**:工具的核心功能是计算不同类型的代码行数,包括注释行、空行和实际的代码行。...

Global site tag (gtag.js) - Google Analytics