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

时间:2013-06-10 21:44:30

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

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

所有这些代码都是基本上增加两个变量,然后将它们相乘。 正如所料,C ++比Java快一点。

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

有没有人知道为什么C ++在上执行计算需要这么长时间?与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;
    }
}

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

两者都在运行代码,最后 product 的值是1999923120.对于C ++和Java都是

好的,我只是尝试创建一个数组并保存i * j乘法的所有结果(以确保它正在运行)。与Java相比,我仍然在为C ++获得巨大的时间。

任何想法为什么会发生在我身上?

SOLUTION:

MS Visual Studio中的

'Platform'自动设置为x32。你只需要将它改为'x64'。很抱歉有一个相当令人困惑的问题,我是VS和C ++的新手。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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 ++代码运行得更快。