【发布时间】:2013-06-10 21:44:29
【问题描述】:
我用 C++ 和 Java 编写了一些代码,看看哪个会运行得更快。
这段代码所做的只是增加两个变量,然后将它们相乘。 正如预期的那样,C++ 比 Java 稍快。
一切都很好,直到我将数据类型从 int 更改为 long(在 C++ 中为 long long)。 然后 C++ 花费了大量时间来执行这段代码,而 Java 的执行时间几乎没有增加。
与Java相比,有谁知道为什么C++在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++ 的新手。
【问题讨论】:
-
您的平台是什么(32 位或 64 位操作系统)?您的 C++ 优化设置是什么?
-
你开启优化了吗?
-
因为在迭代的中间,JVM 开始优化代码的行为。请参阅How do I write a correct micro-benchmark in Java? 以处理针对您的代码的 Java 版本的真实基准测试。
-
问题要么是您的优化设置,要么是您正在构建 32 位代码(或两者兼而有之)。当然,正如其他 cmets 所提到的,可能是 JVM 实际上并没有运行您的代码!
-
我怀疑不同之处在于未显示的代码
标签: java c++ c long-integer long-long