-2

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

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

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

有谁知道为什么 C++与 Java 相比,在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++ 的新手。

4

2 回答 2

2

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

于 2013-06-10T21:50:34.607 回答
1

这段代码:

#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 << product;线,它需要 0.004 秒。

如果我把cout线路放回原处,-funroll-all-loops它会缩短到 4.5 秒。

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

于 2013-06-10T23:30:04.627 回答