介绍
这是我之前提出的问题的后续问题:Java 执行基本算法的速度似乎比 C++ 快。为什么?. 通过那篇文章,我学到了一些重要的东西:
- 我没有使用 Ctrl + F5 在 Visual Studios C++ Express 上编译和运行 c++ 代码,这导致调试减慢了代码执行速度。
- 在处理数据数组时,向量与指针一样好(如果不是更好的话)。
- 我的 C++ 很糟糕。^_^
- 更好的执行时间测试是迭代,而不是递归。
我尝试编写一个更简单的程序,它不使用指针(或 Java 等价物中的数组),并且执行起来非常简单。即使这样,Java 的执行速度也比 C++ 的执行速度快。我究竟做错了什么?
代码:
爪哇:
public class PerformanceTest2
{
public static void main(String args[])
{
//Number of iterations
double iterations = 1E8;
double temp;
//Create the variables for timing
double start;
double end;
double duration; //end - start
//Run performance test
System.out.println("Start");
start = System.nanoTime();
for(double i = 0;i < iterations;i += 1)
{
//Overhead and display
temp = Math.log10(i);
if(Math.round(temp) == temp)
{
System.out.println(temp);
}
}
end = System.nanoTime();
System.out.println("End");
//Output performance test results
duration = (end - start) / 1E9;
System.out.println("Duration: " + duration);
}
}
C++:
#include <iostream>
#include <cmath>
#include <windows.h>
using namespace std;
double round(double value)
{
return floor(0.5 + value);
}
void main()
{
//Number of iterations
double iterations = 1E8;
double temp;
//Create the variables for timing
LARGE_INTEGER start; //Starting time
LARGE_INTEGER end; //Ending time
LARGE_INTEGER freq; //Rate of time update
double duration; //end - start
QueryPerformanceFrequency(&freq); //Determinine the frequency of the performance counter (high precision system timer)
//Run performance test
cout << "Start" << endl;
QueryPerformanceCounter(&start);
for(double i = 0;i < iterations;i += 1)
{
//Overhead and display
temp = log10(i);
if(round(temp) == temp)
{
cout << temp << endl;
}
}
QueryPerformanceCounter(&end);
cout << "End" << endl;
//Output performance test results
duration = (double)(end.QuadPart - start.QuadPart) / (double)(freq.QuadPart);
cout << "Duration: " << duration << endl;
//Dramatic pause
system("pause");
}
观察:
对于 1E8 次迭代:
C++ 执行 = 6.45 秒
Java 执行 = 4.64 秒
更新:
根据 Visual Studios,我的 C++ 命令行参数是:
/Zi /nologo /W3 /WX- /O2 /Ob2 /Oi /Ot /Oy /GL /D "_MBCS" /Gm- /EHsc /GS /Gy /fp:precise /Zc:wchar_t /Zc:forScope /Fp"Release\C++.pch" /Fa"Release\" /Fo"Release\" /Fd"Release\vc100.pdb" /Gd /analyze- /errorReport:queue
更新 2:
我用新的轮函数更改了c++代码,并更新了执行时间。
更新 3:
感谢 Steve Townsend 和 Loduwijk,我找到了问题的答案。在将我的代码编译成程序集并对其进行评估后,我发现 C++ 程序集比 Java 程序集产生了更多的内存移动。这是因为我的 JDK 使用的是 x64 编译器,而我的 Visual Studio Express C++ 不能使用 x64 架构,因此本来就比较慢。因此,我安装了 Windows SDK 7.1,并使用这些编译器来编译我的代码(在发行版中,使用 ctrl + F5)。目前的时间比例是:
C++:~2.2 秒 Java:~4.6 秒
现在我可以用 C++ 编译我的所有代码,并最终获得我的算法所需的速度。:)