Java和C++是否有现实世界的基准测试?

5
在回答问题之前,请注意这个问题不是:
  • Java比C++慢(或快)吗?
  • 为什么Java比C++慢(或快)?
这个问题不是征求意见,而是征求事实——数字。
许多基准测试,例如https://days2011.scala-lang.org/sites/days2011/files/ws3-1-Hundt.pdfhttp://benchmarksgame.alioth.debian.org/测试一些合成的东西,例如曼德博集合,或者最多只测试真实程序的一小部分,例如数组排序。自然地,这样做不会产生像基准测试整个应用程序那样代表性的数字。
因此,是否有一个基准测试使用一个真正的、完整的应用程序,例如:
  • 笔记应用程序或文字处理器
  • 类似Google Maps的地图应用程序
  • 电子邮件客户端
  • Web服务器
它必须是你每天使用的东西——一个完整的应用程序,而不是其中的一小部分,例如二叉树或排序数组。
任何性能测量都可以,无论是延迟还是吞吐量。谢谢。

2
我怀疑任何大型应用程序都不会开发两个版本,一个用Java编写,一个用C++编写。大多数情况下,只是根据特定任务选择更合适的语言。 - Luchian Grigore
1
为了能够对两个真实应用程序进行基准测试,必须使用相同的设计和算法进行开发,我怀疑这是不可能的,但你可以尝试。 - RamonBoza
1
@RamonBoza 这正是问题所在。不同的编程语言有不同的表达方式,一组有经验的 C++ 程序员使用 C++ 编写的代码通常不会选择与一组有经验的 Java 程序员使用 Java 编写的代码相同的组织方式。 - James Kanze
http://cppcms.com/wikipp/en/page/benchmarks_all - Laurent LA RIZZA
你难道不是在用黑白分明的方式来看待这个问题吗?它并不是说某个东西是否代表了真实世界中的场景,而是更符合实际的是什么?我仍然认为笔记应用、邮件客户端、Web 服务器或 Google 地图比芒德布罗特或 DNA 序列更符合我的日常使用。我并不是说它是完美的——没有人能拥有完美的基准。我只是说它更好一些。 - Kartick Vaddadi
显示剩余5条评论
2个回答

1
简单的答案是否定的,我倾向于说这甚至是不可能的,至少在经济上是如此。要做到这一点,你需要同时使用两个不同的团队并行实施同一个应用程序。即使这样做了,差异中有多少是由于语言引起的,又有多少是由于团队相对能力造成的等等,都无法确定。
最终,你不能比较“语言”的性能。最好的情况是,当特定程序员用于特定任务时,可以比较语言实现的性能。从某种意义上说,这是你感兴趣的全部内容:你必须使用可用的程序员和语言实现来实现特定的应用程序。即使有这样的比较,它也不会对你有太大帮助,因为你将使用不同的程序员组和语言实现来实现不同的应用程序(这些程序员可能具有与实施基准测试的程序员不同的技能集)。虽然不同的语言确实具有使优化更加困难或更加容易的特性,但总体而言,在更大的应用程序中(与合成基准相反),这些特性往往被更大的考虑所抵消,或被影响优化的其他特性所抵消:C/C++的指针语义对优化器来说是一种祸害;另一方面,优化Java将需要广泛的装箱,这也并不简单。(顺便说一下:最容易优化的语言可能是Fortran。不是因为语言本身有什么内在的东西,而是因为研究人员已经在这个领域工作了很长时间,并且许多必要的优化技术已经成为主流。)

如果你真的很关心这个问题,你需要让程序员根据你的应用程序模式编写自己的基准测试,并由他们来实施。

最后:很多真实的应用程序,包括文字处理器、电子邮件客户端或者 Web 服务器都是 I/O 绑定的,它们的性能更多地依赖于 I/O 的速度而不是其他任何因素。(对于我所工作的大多数大型服务器,我们甚至没有打开优化器。尽管它们具有时间上的紧迫性,但 CPU 时间并没有影响。)


针对您的最后一条评论:我认为在文字处理器和电子邮件客户端上,大部分时间都是在等待用户操作,所以很难在这些应用程序上获得良好的“吞吐量”数字。好的响应时间可以被测量,但那基本上是您能得到的唯一真正好的数字。此外,这也是用户在他的电子邮件客户端中感兴趣的唯一数字。“如果我按发送键,我希望程序能够非常快速地返回”。 - arne
这要看情况。可以运行一个基准测试来测量在首次设置电子邮件客户端时同步所有电子邮件(例如10GB)所需的时间。使用快速的本地服务器(拥有大量核心和内存),通过千兆以太网连接到客户机。为两台机器配备SSD(或者RAM磁盘)以消除I/O瓶颈。 - Kartick Vaddadi
关于程序员熟练度的评论,我们可以找一些精通C++和Java的人来构建两个版本。这样的人并不少见。例如,我认为自己就是其中之一。虽然我不擅长Python、C#或Rails,但我觉得我有能力比较Java和C++。是的,实现真实应用程序的人与实现基准测试的人是不同的,但这总是基准测试的情况 - 这并不意味着我们不应该进行基准测试 :) 我们永远无法拥有完美的基准测试,但我们可以有一个有用的基准测试。 - Kartick Vaddadi
即使使用SSD或RAM磁盘,电子邮件服务器的大部分时间仍将花费在IO上。这是一种典型的应用程序类型,几乎什么都不做,只进行IO操作---你甚至可以用Python实现,仍然几乎察觉不到差异。 - James Kanze
当然,创建有用的基准测试是可能的。我的观点仅在于,由于要有用,它们将取决于您的应用程序、工作方式和程序员,因此需要您自己创建它们。(曼德博集合非常代表某一类应用程序——它肯定比电子邮件客户端更接近我现在所做的事情。电子邮件客户端更代表I/O绑定的应用程序。) - James Kanze
显示剩余3条评论

-7
Java比C++慢,这是无法改变的事实。原因在于C++编译成本地操作系统二进制代码,可以被操作系统理解。而Java代码编译成二进制的.class文件,需要通过JVM来执行,相对于C++多了一层,所以速度较慢。

4
另一方面,Java虚拟机可以根据运行时反馈动态重新组织程序执行,而C++编译器被迫在编译时选择最小的恶。根据你正在做什么,动态方法可能更有优势。当然,现今单独的代码块在Java中同样可以被编译成机器码。 - Kerrek SB
1
除非它不是。实际上,编写一个Java更快的基准测试很容易,就像编写一个C++更快的基准测试一样容易。当然,两者的性能都取决于实现和优化。 - James Kanze
1
这个答案在10年前是正确的。但现在情况并不那么简单。 - StuPointerException
1
@omickron 你认为什么并不重要。相对性能取决于实现方式,显然有真实世界的情况下,Oracle Java 实现将优于本地 C++。我认识的最好的编译器专家之一告诉我,静态编译程序无法在实际问题中击败 JIT 编译器。我认为他夸大了,但其中肯定有一些真相。 - James Kanze
@JamesKanze:我相信十年或二十年前情况确实不同,就像你之前提到的那样。 - arne
显示剩余12条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接