当前位置:  开发笔记 > 编程语言 > 正文

任何人都可以量化C++和Java之间的性能差异吗?

如何解决《任何人都可以量化C++和Java之间的性能差异吗?》经验,为你挑选了10个好方法。

Java在JIT之前最初很慢,但今天的性能非常接近C++.我想知道是否有人在两种语言之间进行了可衡量的性能比较? 与C++相比,Java在哪里不足? Java为开发人员提供了许多生产力提升,因此他们可以更快地编写应用程序,因为垃圾大学,缺乏指针等.例如,如果用100写的话,可以更快,更可靠地开发应用程序,例如Firefox,Webkit和Open Office. %Java,可能是2倍,但开发人员仍然出于性能原因选择C/C++.是否有人可以证明Java不能像我提到的那样为应用程序执行C++.

我只想补充说,由于某种原因,仍然在C++中完成了很多应用程序工作.这不仅仅是一个主观问题.具有较高抽象级别的语言经常会造成性能损失.如果没有这种惩罚,我们都会用更高级别的语言进行编程.与C++相比,Java仍然在哪里支付?请明确点.



1> jalf..:

语言没有速度.无论是Java或C++语言规格说明"和方案必须编译成为高效".

每一种语言指定事物的程序必须做一个列表,或者至少,表面上做,这在某些情况下,把一个程序如何有效的是一个上限,但通常,一个聪明的编译器可以忽略个别程序规则,因为重要的是程序的行为就像规范已被遵循一样.函数可以内联,堆数据可以移动到堆栈等等.

程序的性能取决于三件事:编译器,底层平台/硬件和程序代码本身.

不是"语言".你得到的最接近的是编译器.

有很好的理由说明为什么这两种语言比另一种语言更快.C++使得更少的承诺,可以执行程序可能放缓,但Java是JIT'ed,这意味着它可能采取的运行信息优势来优化代码,C++不能轻易做......再然后,在无处该规范是否说C++ 不能被jit'ed.就像我相信也有Java编译器生成本机代码而不是JVM字节码.

你的问题才有意义,如果你有你在运行一个特定的计算机,为每种语言特定的编译器,并在每种语言的特定实现你的程序的,在这种情况下,你可以只运行既要看到这是最快的.

垃圾收集是另一个很好的例子.当然,垃圾收集意味着一些开销,但它也可以实现一些重要的快捷方式.堆栈分配在Java或.NET等托管语言中非常便宜,因为它是受管理和垃圾收集的.在C++中,它是......未指定的,当然,但在实践中,通常非常慢,因为操作系统必须遍历堆以在或多或少碎片化的内存空间中找到一个空闲的内存块.哪个最快?取决于操作系统.取决于编译器.取决于源代码.

源代码也有很大的不同.如果您使用Java程序并将其简单地移植到C++,它将像垃圾一样执行.C++不能很好地处理虚拟函数,并且通常有可用的高级替代品.在C++中,堆分配可能非常慢,所以再次,天真地重新实现Java程序将是非常低效的.当采取相反的方式时也是如此.如果直接移植到Java,许多C++习语会不必要地变慢.因此,即使您已经确定了一个平台和一个编译器,您如何比较程序的性能?要将它连接到编译器,你必须编写它的两个实现,然后它不再是相同的程序.

但是,我认为可以说,在大多数现代硬件上,使用现代Java编译器和现代C++编译器,大多数程序都可以实现非常高效,当然也足够快.但只有你理解了你正在使用的语言,并遵守其规则.如果您尝试用C++编写Java代码,那么Java将神奇地变得更加高效,反之亦然.

我想对你的问题最简洁的答案是"不.没有人可以量化C++和Java之间的性能差异";)


答案为+2,对于C++的堆和虚函数= +1的夸张为-1
-1:每个人都知道很难概括Java和C++在所有程序中的表现,但我对人们放弃尝试的方式感到沮丧.这是一个简单的问题,很多人需要就这个问题得到一些指导.在最流行的编译器/平台上,在包含许多算法的大型程序中,什么是良好的经验法则或至少是一堆数据点(即基准)?

2> Barry Kelly..:

对于许多单独的代码构造,JIT编译器可以更快,因为它们可以利用代码的运行时分析.

例如,VonC在回答这个问题时提到了所有对象的堆分配.实际上并非如此:如果可以通过转义分析证明对象的引用不会超过堆栈帧,则JIT可以在堆栈上分配对象.通过这种方式,编译器可以获得堆栈分配的性能优势,同时程序员可以放心假设GC堆分配的安全性.

同样,Uri提到虚函数(在大多数非C++语言中称为虚方法).这是另一种情况,JIT编译器具有几乎永远不可用于提前(AOT)编译器的优点:JIT可以插入内联廉价类型检查(解除引用的字比较)并实际内联虚拟方法调用,如果特定的呼叫站点恰好是单态的(即实际类型在实践中总是相同的).事实证明,高达95%的虚拟方法调用在实践中都是单态的,所以这可能是一个很大的胜利 - 而且这是AOT编译器难以利用的一个胜利,因为运行时代码加载可能会改变运行时特性动态.



3> VonC..:

要完成Pax和Uri的答案,这里有一些最近的基准:

性能比较 - C++/Java/Python/Ruby/Jython/JRuby/Groovy

Java性能(维基百科)

如上所述,这是两种截然不同的语言,有些人确信Java会比C++慢,原因如下:

所有对象的堆分配(甚至是迭代器之类的小对象)

很多动态铸件

增加内存使用量

[幽默]

"Java是高性能的.通过高性能我们意味着足够.足够我们意味着慢." 兔子先生

如评论中的dribeas所述,堆分配不是一个好的论据.
这个" 城市表演传说,重访 "提到:

"垃圾收集永远不会像直接内存管理那样高效." 而且,在某种程度上,这些陈述是正确的 - 动态内存管理不是那么快 - 它通常要快得多.
malloc/free方法一次处理一个内存块,而垃圾收集方法倾向于大批量处理内存管理,从而产生更多的优化机会(以可预测性的某些损失为代价).


我做了自己的性能比较:http://www.edval.biz/benchmarking-java-versus-c-with-astar,这是一个很小但仍然很重要的CPU密集型程序.令人惊讶的是,我发现Java的速度提高了30%.由于我是C++的粉丝,而且是C++专家,我非常努力地扭转结果.然而,经过一些非常全面的实验,我相信Java更快.原因可能是C++优化编译器无法假设"没有别名".如果您不相信我,请下载我的源代码或尝试自己.

4> Gilles..:

还有另一个板凳:枪战



5> Uri..:

在许多方面,这就像比较苹果和橙子.

C++建立在你不为任何不使用的东西付费的概念之上.如果您自己管理内存,如果您不使用虚拟功能等.

Java并没有给你那种自由.它为您提供了您可能不想要的功能.对于您可能想要自己分配内存的所有内容,您将不得不使用堆对象来处理所有内容,因此您将受到垃圾收集的影响.

一旦你开始谈论GUI,这是一个更难的比较,因为不同的UI框架和工具包有不同的性能问题.例如,Swing/AWT通常比直接为本机OS编写的内容慢.在C++中,您很少会找到真正的便携式工具包等.

我认为当开发人员启动openoffice时,Java速度要慢得多,而且UI工具包很慢而且很丑陋.像Eclipse这样的工具证明你甚至可以在Java中构建相对优秀的UI,但不可否认,SWT是一个在本机级别执行大量工作的工具包.



6> Koen Van Dam..:

许多人忘记了JIT技术可以应用于任何类型的二进制文件,甚至是由C++编译器生成的二进制文件.如果您使用类似HP的Dynamo(一种运行可执行文件的模拟器比运行和模拟的本机芯片更快),JIT编译Java的大部分好处对C++也有效.运行时分析实际上并不是Java的性能优势,而是一般的JIT编译.



7> Foredecker..:

对我来说,这个问题有点像红色鲱鱼(也许不是故意的).这是一个非常错误的问题.

要问的第一个问题是这些

    什么让我的程序变慢?

    对于我的新计划,关键性能设计考虑因素是什么?

这里有一些很好的'为什么'的问题

是否有太多不必要的I/O?

是否使用了太多内存?

内存分配器是否被破坏(分配太多,细粒度太多的对象)

我的程序是否在网络I/O上长时间被阻止

锁在错误的地方

我怀疑你真的需要把重点放在P程序的erformance方面(大写"P")instea OD的p第一erformance(小的"p")方面.如果你能够达到语言阻碍的程度,那么就性能而言,你已经做了很好的工作.

对于新代码 - 预先计划性能和效率非常重要.我总是建议性能和效率与任何其他功能(它们都是功能)一样对待:就像UI bling或可靠性一样. 当然,这将取决于许多事情 - 但是当它很重要时,你需要预先计划:

选择适合数据集和预期缩放的数据结构和算法

适当的基于多线程UI的应用程序(UI线程,后台/处理线程)

规划长网络I/O延迟

计划预先设定目标和衡量绩效 - 定期进行回归测试

测量内存使用情况 - 记忆猪很慢(让japes开始:))

何时存在事件,回调或其他通知机制时不进行轮询

我认为这是一个红色鲱鱼的原因是很少有人可以在C++和Java之间做出选择 - 它们是非常非常不同的语言,具有非常不同的运行时间.我怀疑更常见的是你有其他限制因素推动你 - 这些将是比语言表现更高阶的因素.与现有代码,现有员工的技能和经验等的可计算性等.

环境也有所不同.例如,Java几乎永远不会是寡妇客户端(与Web)应用程序的正确选择.相反,原生C++几乎永远不会成为基于Web的应用程序的选择.(注意,我是一个Windows家伙 - *nix中的情况可能非常不同).



8> paxdiablo..:

我不相信任何人都可以证明C++总是比Java更有意义,因为你总是可以恢复到JNI以从Java获得原生速度.

例如,参见SWT,它是IBM(我认为)构建的图形工具,旨在取代Swing并提供本机性能和外观.

因此,我认为开发速度比速度快,因为我认为最小开发时间比原始应用程序速度更重要,特别是当我仍然能够达到这个速度时 - 我可以同时拥有Java的易开发性.编译语言的速度.



9> Aaron Digull..:

有些要点需要考虑:

如果你有一个更好的C++编译器,你的代码不会变得更快.您需要先重新编译它.如果您获得了更好的JVM,那么所有Java代码都将运行得更快

如果你有一个更好的C++编译器/ JVM,你会看到执行速度提高10-20%,通常是在极端情况下.如果您找到更好的算法来实现您的需求,您可以轻松获得1,000%-10,000%的性能,有时甚至更多.

所以今天,如果表现是一个问题,你应该看看这两个事实:

语言用一种算法替换另一种算法有多容易?(又名"重构")

你能用多快的速度编写代码?

其他任何东西都只是FUD.



10> quant_dev..:

我已经在C和Java中实现了对性能敏感的应用程序(物理模拟,财务模型).实际情况是,通过改变算法而不是通过调整实现,我总能获得更大的性能提升 - 但实现也很重要.至于现在,我的观点是Java比C慢(我对C++中的数字没有那么多经验),但通过仔细调整可以获得很多,而且这种调整在Java中更容易,因为你不必处理分段错误,双重释放等.C++占据了中间地带,因为现代C++技术(智能指针,模板,STL容器)提供了速度和相对安全性.

推荐阅读
TXCWB_523
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有