我用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 ++获得巨大的时间。
任何想法为什么会发生在我身上?
'Platform'自动设置为x32。你只需要将它改为'x64'。很抱歉有一个相当令人困惑的问题,我是VS和C ++的新手。
答案 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 ++代码运行得更快。