在SO和其他地方,Java长期以来一直以缓慢而著称。从笑话到对问题和答案的许多评论,人们仍然认为Java仅仅基于90年代的经验就很慢。
这是我的问题:我们(大多数)不赞成人们认为Java速度慢的原因。除了小事之外,Java相当快。
那么为什么人们仍然拒绝相信Java很快呢?他们的心态一部分就是没有C / C ++的事情进展缓慢吗?是因为人们不随时间检查吗?是因为人们只是有偏见?
在SO和其他地方,Java长期以来一直以缓慢而著称。从笑话到对问题和答案的许多评论,人们仍然认为Java仅仅基于90年代的经验就很慢。
这是我的问题:我们(大多数)不赞成人们认为Java速度慢的原因。除了小事之外,Java相当快。
那么为什么人们仍然拒绝相信Java很快呢?他们的心态一部分就是没有C / C ++的事情进展缓慢吗?是因为人们不随时间检查吗?是因为人们只是有偏见?
Answers:
这是应用程序。当你注意,我们已经证明,一次又一次,在人为的情况下Java代码能够满足,甚至打的,如C,C ++,Lisp语言,VB6,或JavaScript的所谓“高性能”语言的表现。当得到这样的证据时,大多数理智,豁达的反对者都会羞愧地垂头丧气,并保证不再散布这种诽谤。
...但是随后,他们启动了Eclipse,NetBeans或Guiffy,或在浏览器中启用了Java支持,或尝试在自己喜欢的功能手机上运行应用程序。他们等待它变得响应...
...然后等待...
...然后等待...
...然后...
...等待...
... ...
...我保证不再做任何事情?抱歉,一定打do睡了...
这个问题是在错误的前提下进行的:重要的是,Java仍然很慢。重要的是大型数据集上的大量计算算法。当然,可以对它们进行优化,有时可以与C / C ++代码相提并论,但仅以模块化和通用性为代价。可以将高效的C ++代码设计为通用的,并可用作通用库。Java代码不能。试想一下,在高度优化的Array.sort
方法,即用不同的实现所有基本类型,且其对象变种仍远低于C ++通用较慢sort
,因为这些对象必须动态地调度相等比较。
当然,由HotSpot引擎执行的及时优化实际上可以预测这些虚拟调用的目标并尝试内联。但这仍然比在C ++ sort
方法中调度的直接内联调用慢。
我的一位前同事已经使用模板C ++实现和面向对象的Java实现对大型数据集(使用动态形状进行q- gram计数)上的问题进行了比较基准测试。Java代码比C ++代码慢几个数量级。
当然,这是将苹果与橙子进行比较。但是关键是,Java实现是最好的实现(就性能而言,考虑到库所需的模块化程度),C ++实现也是。
不幸的是,基准数据不是免费提供的,但是其他人在比较运行时抽象的开销时发现了相似的数字。例如,Scott Meyers在Effective STL中编写了有关C泛型qsort
函数的开销的信息:
当涉及到速度时,C ++的排序实际上总是使C的qsort感到尴尬。[…]在运行时,sort对其比较函数进行内联调用…,而qsort通过指针调用其比较函数。[…]在对一百万个翻倍向量的测试中,[sort]的运行速度提高了670%…
std::sort
这是很难用其他语言进行类似操作的情况之一。但是我见过的绝大多数项目都不是在编写std::sort
类似代码的代码。他们正在用C ++编写(错误的)Java代码,并抱怨它们有问题。
因为它很慢...在某些应用程序中。桌面应用程序必须从一开始就做出响应,并且启动开销很慢。
另一方面,如果您运行服务器,则是否发热(JIT分析和编译)并不重要-您只需在蓝月亮中进行一次,因此在大多数情况下都不能认为它完全慢。
我说这是因为当人们第一次遇到它时,它很慢。基于此,他们对它产生了印象。如果他们不使用它,则该印象不太可能改变,并且由于该印象,他们不使用它-这是一个恶性循环。
我必须承认,我给人的印象是Java的运行速度很慢,是的,那是由于我以前接触过它。从那以后,我现在开始使用不同的语言,并且接触Java的机会非常有限。因此,我的看法并没有太大改变。
它与Java的发展速度无关。在人们看来,Java是与单词“ slow”相关联的const标识符。您或Oracle几乎无能为力。
高兴的是,Oracle还没有通过轻率或愚蠢的事情破坏Java编程文化。就像收取过多的使用许可费用。或基于Sun先前拥有的软件专利起诉人们。::叹::
我不想在这里成为反对者,但是,除非甲骨文和谷歌以友好的方式解决Java争端,否则谷歌被迫购买Java并使其成为“合适的”开源平台,否则Java一定会成为孩子有虱子的操场。IE,没有人会想用20英尺高的杆子来触摸它。
注意:请明确地说,当我说一代时,我是在用人的术语而不是计算机的术语说话。IE,直到持有该感知的人过世或被年轻一代取代,该感知才成立。用5年而不是5年来思考。
原因之一是人们信任别人怎么说,而不是别人看到的东西。
根据我刚开始编程时所得到的信息,Java比C ++“慢”,之所以可以使用Java,是因为它“方便且容易”。人们通常认为Java以性能为代价带来安全性和便利性。即使后来发明了C#,人们仍然认为它比Java更快,因为它是“本机”的。
但是人们不知不觉中发现的事实是,eclipse是用Java构建的IDE,绝对是同类中最快的IDE。我使用了几乎所有主流的IDE,包括来自MS和GNU,Borland的主流IDE,eclipse是IDE的绝对王者,主要是因为它的速度很快。
另一个原因是启动时间长。
Java不适合开发留在系统托盘中的微型应用程序,会占用少量内存,并弹出一个对话框提醒您休息;或用于打开文本文件,阅读并关闭它的记事本。它应该在BIG之类的东西上使用,例如始终存在的Web服务器,以优化利用计算资源,每小时响应数百万个请求。或者像eclipse这样的IDE可以管理数千个工作区文件。我相信,直到Java应用运行至少几个小时,您才知道它的运行速度。
@bigown“为什么人们仍然说Java很慢?”
因为他们很笨。因为他们没有工作经验,但是认为他们是Dikjstra的活着化身,还是Linus Torvald的第二次来世,哦,我不知道。说出这种智障的原因的原因很多,但通常是愚蠢,无意识的主观狂热和情感上的关注-背后的原因。
让我们对此进行剖析,以便您可以了解我上面所说的事实:
首先,在什么情况下,在什么情况下,在什么情况下,在什么条件下,在什么工程/科学/商业目的下慢(说它很烂不是其中之一)。任何对任何技术说“ X慢”的人X,或简称为“ X is Y”,其中Y是某种否定性陈述,如果不回答上述任何问题,则视为傻瓜。诸如此类的声明在工程中没有位置。可能在政治和青少年聊天室中,但在工程学中则没有。
其次,大多数这些被误导的傻瓜都对Java的运行速度感到哭泣,因为ZOMG使其日食永远耗费时间(哎呀,用所有插件加载东西,然后猜测会发生什么。)这些傻瓜中的大多数甚至都不知道如何调整jvm以使Eclipse能够快速运行(或针对任何Java应用程序)。也就是说,他们对性能调优一无所知,这不仅对于Java,对于任何非平凡的系统(无论是硬件还是软件)都是现实。因此,在这种情况下,他们在做出这种无意识的声明时出于任何技术上的有效性而无法武装自己。
第三,让我们考虑一下Java开发的主要目的:首先是后端OLTP;然后是OLTP。监控系统排名第二。两种类型的系统都旨在在集群中运行,并且连续运行数周甚至数月。那么,当REAL Java应用程序的目的是长时间运行时,您的小日食或玩具应用程序需要花费一两分钟的加载时间真的重要吗?上下文,人员,上下文。
最后,Google和Ebay上OLTP的主干运行在Java上。我将其作为矛盾的证据来证明Java并不慢(至少在重要的条件下,不是为了小小的玩具实验,基准测试和无法验证的附带证据而专门为说“ tehe X慢,很烂”而做)。
有工程,有狂热。猜猜那些属于哪些类别声明?
-O2
)以使C ++可以以可接受的速度快速运行,则Java速度很慢。
it is slower than something else.
美洲虎比猎豹慢。这使前者成为现实slow
吗?尝试一些工程的客观性和问问你自己:可以在一个逻辑声明,arbitrarily
即什么是slow
简单,因为it is slower
比别的东西without mentioning a context of operations
,它定义了是fast enough
为了什么?逻辑上可以吗?
因为是这样,我们可以永远结束这个话题吗?
https://days2011.scala-lang.org/sites/days2011/files/ws3-1-Hundt.pdf [向下滚动至表格,Java比C ++慢3.7-12.6倍,谷歌员工研究]
PS:如果不是这样,请至少给我命名一个快速的Java应用程序,之前从未见过。
TMHO,这是因为在浏览器中启动VM所需的时间。如果应用程序启动缓慢,人们只会记住这一点。因为,长时间的启动确实很烦人。真。我的一位同事告诉我,他不使用Firefox,因为它太慢了。(?!?)。但是,是的,好的,在Windows上,Firefox需要花费大量时间才能显示出来。据他介绍,这个应用程序运行缓慢,他决定要注意它的总体速度。
比起慢什么?我正在考虑从普通的Ruby更改为JRuby(基于Java的ruby),因为我听说它更快。
意见是意见,事实是事实。
这是Google Code Jam的一个事实,它可以挑战程序员在短时间内解决棘手的计算问题,这意味着他们使用的语言的性能起着重要的作用:
在过去的版本(2009年,2010年和2011年)中,进入决赛的程序员中约有75%使用C ++,而使用Java的则约为15%。
大约在1997年,我使用了HP Vectra VE(200 MHz)和Windows95。大多数应用程序在此上运行非常快,但是后来我尝试了一些用Java编写的应用程序(如果我没记错的话,是IDE)。它们非常慢,至少是其中的GUI部分。他们花了很长时间才能启动,并且GUI元素(例如菜单)的响应速度不是很好-视觉反馈存在延迟。另外,由于Java GUI应用程序具有(非常)独特的外观,因此我学会了将此外观(和Java)与较差的性能相关联。
这取决于您所说的缓慢。
首先,java最近取得了许多进步,并且在大多数情况下非常快。但是:
顺便说一下,在某些情况下,java比普通的C / C ++更快。但是那些语言为您提供了调整它们的工具。
Java是一种针对生产力的编程语言。现在,它对于大多数应用程序来说已经足够快了,但是对于其他一些应用程序来说还不够。
通常,Java的速度过慢是一个过度使用的论点,因为在大多数情况下它是毫无意义的。
简单,规范的Java代码往往与简单,规范的C / C ++ / D代码同等或更快。简单,规范的代码往往会不必要地执行大量内存分配,没有特别针对任何CPU架构进行调优,没有对它进行大量的低级优化,等等。Java的HotSpot GC令人惊叹,VM优化比静态编译器可以做的更好。
另一方面,如果您确实需要性能,并且愿意手动调整性能以获取性能,则C / C ++ / D为此提供了更多机会。您不能在Java中使用内联汇编程序。您不能使用脏类型的校正技巧将浮点数视为位数组。对于您的特定用例,您不能使用可能比GC更快的自定义内存管理方案。在Java中,您不能在堆栈上分配比在C / C ++ / D中那么多的内存。在Java中,获得与高阶函数大致相当的任何东西的唯一方法是使用接口和运行时绑定。在D和C ++中(如果我错了,请纠正我),您可以将函数传递给模板,从而允许在编译时进行绑定而不会失去灵活性。
Java“慢”的另一点是64位运行时。
我听说有人抱怨Java在64位计算机上对他们而言非常慢。事实证明,64位Java运行时使用服务器JVM,该服务器在启动之前会编译整个程序。
这里是解释为什么64位VM启动速度较慢的原因。
例如在Windows上:
C:\> java -version
java version "1.6.0_21"
Java(TM) SE Runtime Environment (build 1.6.0_21-b06)
Java HotSpot(TM) 64-Bit Server VM (build 17.0-b16, mixed mode)
Java的性能是非常主观的,但是,为什么Java这么慢的理解很大程度上是由于其他人已经指出的原因:大多数人对某种事物的理解是由他们早期的使用经验所染上的,而Java并非一直是一种经过良好优化的语言。引擎盖。同样,与像Visual Studio这样的IDE相比,香草Eclipse也不是一种可以快速使用的IDE,并且在响应能力方面显得苍白。
也就是说,除了Java在启动时遇到的UI问题之外,它对于大多数应用程序来说足够快。如果您进行搜索,则会发现将其与其他语言进行比较的文章,并且所显示的大多数结果都将其归类为仅在处理主要数据集时才有问题的范围。
在生物信息学领域,它得到了广泛的使用,因为它得到了很好的支持,并且已经为它提供了安装基础。Java的优点之一是,您可以使用它进行一些相当快速的开发,而这是C语言无法完成的。如果您查看用于生物信息学的语言(我个人经常使用R,Python和Java),您会注意到它们都不是最快的,并且生物信息学中的数据集运行到100年代并不罕见。千兆字节的信息。归根结底,人工时间仍然更具价值,虽然速度差异明显,但数据集的大小往往足够大,以至于它们无论如何都要通宵运行。
如果使用Java编写简洁的UI更加容易,那么速度感知将像雷达一样逐渐消失,因为大多数人没有足够的语言来推动速度,这确实是每天的问题。
抛开一文不值的钱,我发现Java Web应用程序通常具有很长的启动和响应时间,在我看来,Python或Ruby会做得更好。
我在大多数编程中都使用Eclipse,并且必须说Java与其他任何事物一样快,即使在本地和“独立”环境下运行得更快。
我会说Java无限慢,而不仅仅是速度慢,因为Java无法解决在真正的高级语言中容易解决的简单问题。
让我举一个简单的例子。有两次映射列表时适用的简单优化,称为砍伐森林:这是用我的语言Felix编写的规则:
reduce deforest[T,U,V] (f:T->U, g:U->V, x:list[T]):
map g (map f x) => map (compose(g,f)) x
;
这表示:不是将列表x与f映射,而是与g再次映射,需要两次遍历列表并创建一个垃圾临时列表,只需将列表与函数组成进行映射即可。
这是一个高级优化,远比Java JVM的低级性能重要得多。我上面给出的规范不仅是漂亮的语法,这是 用户编写的一条指令,告诉Felix编译器如何执行优化。
请告诉我如何在Java中执行这种操作。没有?然后Java很慢。非常慢。[我相信Haskell可以自动执行此操作]。
在您说“但是Java是一种OO语言之前,这种优化并不适用” ..那正是我的意思。Java很烂,而成为OO是主要原因。
JIT优化永远无法与像样的编译器可以完成的优化竞争。