我用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++代码运行得快。