Java真的很慢吗?

问题:

Java有some degree of reputation for being slow

  • Java真的很慢吗?
  • 如果是,为什么?瓶颈在哪里?是因为低效JVM吗?垃圾收集?纯字节码库代替JNI包装的C代码?许多其他语言具有这些功能,但是它们没有这种缓慢的声誉。

回答:

现代Java是最快的语言之一,尽管它仍然是一个记忆猪。 Java 因缓慢的声誉,因为它需要很长时间才能启动虚拟机。
 如果你仍然认为Java速度很慢,请参阅the benchmarks game结果。以前期编译语言(C,Fortran等)编写的紧密优化代码可以击败它;然而,Java可以比PHP,Ruby,Python等快10倍。有特定的区域可以击败常见的编译语言(如果使用标准库)。
 现在没有任何“慢”Java应用的借口。开发人员和遗留代码/图书馆的责任远远超过语言。还责怪任何“企业”。

公平地说,“Java很慢”的人群,这里还是很慢的地方(2013年更新):

  •  图书馆经常写为“正确性”和可读性,而不是性能。在我看来,这是Java仍然有不良声誉,尤其是服务器端的主要原因。这使得String问题呈指数级变化。一些简单的错误是常见的:通常使用对象代替图元,降低性能并增加内存使用。许多Java库(包括标准的)将经常创建字符串,而不是重用可变或更简单的格式(char []或StringBuffer)。这很慢,造成大量垃圾收集。为了解决这个问题,我建议开发人员在可能的情况下使用原始集合,特别是Javalution的库。
  •  字符串操作有点慢。 Java使用不可变的UTF-16编码的字符串对象。这意味着你需要更多的内存,更多的内存访问,一些操作比使用ASCII(C,C ++)更复杂。当时,这是可移植性的right决定,但是它具有小的性能成本。 UTF-8现在看起来更好。
  •  阵列访问比C慢一点,由于边界检查。惩罚过去很大,但现在很小(Java 7优化了很多冗余边界检查)。
  • 缺少任意内存访问可以使一些I / O和位级处理变慢(例如压缩/解压缩)。 This is a safety feature of most high-level languages now.
  •  Java使用比C更多的内存,,如果您的应用程序是内存限制或内存带宽限制(缓存等),则会使其更慢。另一方面,分配/释放快速(高度优化)。 This is a feature of most high-level languages now, and due to objects and use of GC rather than explicit memory allocation.加上坏的图书馆决定。
  •  基于流的I / O速度很慢由于(IMO,糟糕的选择)需要在每个流上进行同步访问。 NIO解决了这个问题,但使用起来很痛苦。可以通过对数组进行读/写,而不是一次使用元素来解决这个问题。
  •  Java不提供与C相同的低级功能,,所以你不能使用脏的内联汇编技巧来使一些操作更快。 This provides portability and is a feature of most high-level languages now.
  •  通常看到Java应用程序与非常旧的JVM版本相关联。特别是服务器端。与最新版本相比,这些旧的JVM可能会非常低效。

最终,Java旨在提供安全性和可移植性,牺牲一些性能,并为其显示的一些非常苛刻的操作。其大部分的缓慢声誉不再是值得的。

但是Java有几个地方

  •  内存分配和取消分配
    是快速和便宜。
    我曾经看过案例
    哪里是20%更快(或更多!)到
    分配一个新的多kB数组
    重新使用缓存的。
  •  对象实例化和面向对象的功能使用起来非常快(在某些情况下比C ++更快),因为它们是从一开始就设计的。这部分来自于良好的GC,而不是明确的分配(对于大量的小对象分配而言更为友好)。人们可以编程C来打败它(通过滚动自定义内存管理和有效地执行malloc),但这并不容易。
  •  方法调用基本上是免费的,在某些情况下比大法代码快。 HotSpot编译器使用执行信息优化方法调用,并具有非常高效的内联。通过使用额外的执行信息,有时候可以优于预期的编译器,甚至(在极少数情况下)手动内联。与C / C ++相比,如果编译器决定不进行内联,那么方法调用会带来小的性能损失。
  •  同步和多线程是简单高效的。 Java开始时被设计为线程感知,它显示。现代计算机通常具有多个内核,并且因为线程内置在语言中,所以您可以非常轻松地利用这些内核。基本上,额外的100%到300%的速度提升与标准的单线程C代码。 Yes, carefully written C threading and libraries can beat this, but that’s a lot of extra work for the programmer.
  •  字符串包括长度:一些操作更快。这使用空分隔字符串(在C中常见)。在Java 7中,Oracle取出了String.subString()优化,因为人们愚蠢地使用它并获得内存泄漏。
  •  阵列副本被高度优化。在最新版本中,Java使用手动调谐汇编器进行System.arraycopy。结果是在arraycopy / memcopy重操作中,我看到我的代码在C中以合理的边距击败了等同的代码。
  •  JIT编译器对于使用是很聪明的。无时间编译的程序无法将其代码实时调整到其运行的特定CPU和系统。 JIT以这种方式提供了一些非常有效的循环变换。

其他几个历史事实促成了“Java是缓慢”的声誉:

  • 在JIT编译之前(Java 1.2 / 1.3),语言只被解释,而不是编译,因此非常慢。
  • JIT编译需要时间才能有效(每个版本都有重大改进)
  • 多年来,类加载已经变得更加高效。在启动过程中,过去是非常低效和缓慢的。
  •  Swing和UI代码没有使用本机图形硬件。
  •  摆动只是可怕我指责AWT和Swing为什么Java从未在桌面上遇到过。
  • 在图书馆类中大量使用同步;不同步的版本现在可用
  • 由于通过网络发送完整的JAR并将虚拟机加载到引导中,Applet将永远加载。
  • 用于承受重度性能损失的同步(已经针对每个Java版本进行了优化)。反思仍然是昂贵的。

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Is Java really slow?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

− 2 = 5