【问题标题】:Long data type calculation - Why is Java much faster than C++ [duplicate]长数据类型计算 - 为什么 Java 比 C++ 快得多 [重复]
【发布时间】:2013-06-10 21:44:29
【问题描述】:

我用 C++ 和 Java 编写了一些代码,看看哪个会运行得更快。

这段代码所做的只是增加两个变量,然后将它们相乘。 正如预期的那样,C++ 比 Java 稍快。

一切都很好,直到我将数据类型从 int 更改为 long(在 C++ 中为 long long)。 然后 C++ 花费了大量时间来执行这段代码,而 Java 的执行时间几乎没有增加。

与Java相比,有谁知道为什么C++在long上执行计算需要这么长时间?

C++ 代码 *(~53 秒,与 __int64 的结果相同)* :

long long limit  = 2e9;
long long loopLimitI = sqrt(limit);
long long product = 0;
for(long long i = 2; i < loopLimitI; i++){
    long long loopLimitJ = limit / i;
    for(long long j = 2; j < loopLimitJ; j++){
        product = i * j;
    }
}

Java 代码 (~11 秒) :

long limit = (long) 2e9;
long loopLimitI = (long) Math.sqrt(limit);
long product = 0;
for(long i = 2; i < loopLimitI; i++){
    long loopLimitJ = limit / i;
    for(long j = 2; j < loopLimitJ; j++){
        product = i * j;
    }
}

编辑:我的操作系统:Windows 8 (x64)。 优化设置 - /O2

两者都在运行代码,最后product的值为1999923120。C++和Java都可以

好的,我刚刚尝试创建一个数组并保存 i * j 乘法的所有结果(以确保它正在运行)。与 Java 相比,我仍然对 C++ 有很大的兴趣。

知道为什么会发生在我身上吗?

解决方案:

MS Visual Studio 中的“平台”自动设置为 x32。您只需将其更改为“x64”。抱歉,我是 VS 和 C++ 的新手。

【问题讨论】:

  • 您的平台是什么(32 位或 64 位操作系统)?您的 C++ 优化设置是什么?
  • 你开启优化了吗?
  • 因为在迭代的中间,JVM 开始优化代码的行为。请参阅How do I write a correct micro-benchmark in Java? 以处理针对您的代码的 Java 版本的真实基准测试。
  • 问题要么是您的优化设置,要么是您正在构建 32 位代码(或两者兼而有之)。当然,正如其他 cmets 所提到的,可能是 JVM 实际上并没有运行您的代码!
  • 我怀疑不同之处在于未显示的代码

标签: java c++ c long-integer long-long


【解决方案1】:

你编译它没有优化。使用适当的设置编译,C++ 版本将在 0 秒内运行,因为它什么也不做。

【讨论】:

  • 为什么什么都不做?
  • OP 没有显示足够的上下文来知道它是否什么都不做,但是显示的代码当然可以用单个 product = SOME_CONSTANT 行替换。
  • @JerryCoffin 但是我们怎么知道 OP 不是在代码 sn-p 之外使用product
  • 即使这样,结果也只需要最后一次迭代,实际上它是恒定的。
  • @0x499602D2:我们显然不知道他在做什么。我们确实知道他所展示的内容并非如此。
【解决方案2】:

这段代码:

#include<iostream>
#include<cmath>

using namespace std;

int main()
{
    long long limit  = 2e9;
    long long loopLimitI = sqrt(limit);
    long long product = 0;
    for(long long i = 2; i < loopLimitI; i++){
        long long loopLimitJ = limit / i;
        for(long long j = 2; j < loopLimitJ; j++){
            product = i * j;
        }
    }
    cout << product;
}

在我的 3.4GHz Athlon64 机器上花费 12.1 秒(在 64 位模式下使用 g++ 4.6.3 - 在 32 位模式下速度较慢,这是自然原因,因为所有 64 位操作都需要两倍的步骤,所以只需不到两倍的时间)。如果我删除 cout &lt;&lt; product; 行,则需要 0.004 秒。

如果我将cout 线放回并执行-funroll-all-loops,它将缩短到 4.5 秒。

我没有运行 Java 代码的 Java 环境,但我认为它不会比 C++ 代码运行得更快。

【讨论】:

  • 谢谢!是的,是 32 位模式导致了问题。
  • since all the 64-bit operations take twice as many steps 进行乘法运算的步骤是原来的 4 倍,而其他复杂的运算可能要多得多
猜你喜欢
  • 1970-01-01
  • 2013-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-10
  • 2012-12-03
  • 2014-04-21
  • 2015-02-09
相关资源
最近更新 更多