长数据类型计算-为什么Java比c++快得多
Long data type calculation - Why is Java much faster than 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++代码运行得快。
- 为什么通过引用返回向量比通过移动返回要快得多?
- 禁用优化后,quick-bench.com 基准测试要快得多
- C++ OpenMP 斐波那契:1 个线程的执行速度比 4 个线程快得多
- 为什么迭代 std::array 比迭代 std::vector 快得多?
- 为什么<wstring>使用自定义 wcscmp 和 wmemcmp 比较器对向量进行排序比默认快得多?
- C 为什么在原始双阵列中的分配似乎比双变量分配要快得多
- Linux 在从文件中读取数据并放入矢量时比 Windows 快得多.txt.我将如何加速Windows以做同样的事情
- 为什么 C 数组比 std::array 快得多?
- 为什么 pcre 正则表达式比 c++11 正则表达式快得多
- 为什么数组比向量快得多
- 为什么 ifstream::read 比使用迭代器快得多
- 为什么其中一个比另一个快得多
- GDI+Image比C#Image快得多
- 为什么堆栈内存的 memcpy 比堆内存快得多
- 为什么使用TBB的OpenCV函数比基于Boost的实现快得多
- 为什么多个文件的编译速度比合并文件快得多
- 为什么Windows C++多线程IOPS比IOMeter快得多
- 为什么STL算法使用指针比std::向量迭代器快得多
- 为什么使用 mkdir () 函数比使用 system ('mkdir 路径')快得多?
- 为什么Eigens-mean()方法比sum()快得多