语言没有速度。Java 或 C++ 语言规范都没有指定“并且程序必须编译为如此高效”。
每种语言都指定了程序必须做的事情的列表,或者至少看起来要做的事情,这在某些情况下为程序的效率设定了上限,但通常,聪明的编译器可以在单个程序中忽略这些规则,因为重要的是程序的行为就像遵循了规范一样。函数可以内联,堆数据可以移动到堆栈等等。
程序的性能取决于三件事:编译器、底层平台/硬件和程序代码本身。
不是“语言”。你得到的最接近的是编译器。
两种语言都比另一种更快是有充分理由的。C++ 做出的承诺可能会减慢程序执行速度,但 Java 是 JIT 的,这意味着它可能会利用运行时信息来优化代码,而 C++ 不能轻易做到这一点......规范是否说 C++不能被 jit'ed。就像我相信也有 Java 编译器生成本机代码而不是 JVM 字节码一样。
只有当您有一台正在运行的特定计算机、每种语言的特定编译器以及每种语言的程序的特定实现时,您的问题才有意义,在这种情况下,您可以同时运行两者以查看哪个是最快的。
垃圾收集是另一个很好的例子。当然,垃圾收集意味着一些开销,但它也启用了一些重要的捷径。在 Java 或 .NET 等托管语言中,堆分配非常便宜,因为它是托管和垃圾收集的。在 C++ 中,它是....未指定,当然,但在实践中,通常非常慢,因为操作系统必须遍历堆才能在或多或少碎片化的内存空间中找到空闲的内存块。哪个最快?取决于操作系统。取决于编译器。取决于源代码。
源代码也有很大的不同。如果你将一个 Java 程序天真地移植到 C++ 中,它的表现会像垃圾一样。C++ 不能很好地处理虚函数,通常有更好的替代方案可供您使用。堆分配在 C++ 中可能非常慢,因此再次天真地重新实现 Java 程序将是极其低效的。当走相反的路时也是如此。如果直接移植到 Java,许多 C++ 习惯用法会不必要地变慢。因此,即使您选择了一个平台和一个编译器,您如何比较程序的性能?甚至要让它编译器,你必须编写它的两个实现,然后它就不再是同一个程序。
但是,我认为公平地说,在大多数现代硬件上,使用现代 Java 编译器和现代 C++ 编译器,大多数程序都可以非常高效地实现,而且速度肯定足够快。但前提是您了解您正在使用的语言并遵守其规则。如果您尝试用 C++ 编写 Java 代码,那么 Java 会神奇地变得更加高效,反之亦然。
我想对您的问题最简洁的回答是“不。没有人可以量化 C++ 和 Java 之间的性能差异”;)