长数据类型计算-为什么Java比c++快得多



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

所有这些代码所做的基本上是增加两个变量,然后将它们相乘。正如预期的那样,c++比Java稍微快一些。

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

有谁知道为什么c++在long上执行计算要比Java花这么长时间吗?

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;
    }
}
编辑:

我的 OS : Windows 8 (x64)。优化设置 -/O2

都在运行代码,最后product的值为1999923120。c++和Java

好的,我只是尝试创建一个数组并保存I * j乘法的所有结果(以确保它正在运行)。与Java相比,我仍然在c++上花费了大量的时间。

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

<标题>解决方案:

MS Visual Studio中的"Platform"自动设置为x32。你只需要把它改成"x64"。对不起,这是一个相当令人困惑的问题,我是VS和c++的新手。

编译时没有进行优化。使用适当的设置编译,c++版本将在0秒内运行,因为它不做任何事情。

代码:

#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.004s。

如果我把cout线放回-funroll-all-loops,它会把它降低到4.5s。

我没有Java环境来运行Java代码,但我不相信它会比c++代码运行得快。

相关内容

  • 没有找到相关文章

最新更新