介绍
这是我之前提出的一个后续问题:Java似乎比C++更快地执行基本算法,为什么? 通过那篇文章,我学到了一些重要的东西:
- 在Visual Studios C++ Express上编译和运行c++代码时,我没有使用Ctrl + F5,这会导致调试减慢代码执行速度。
- 向量在处理数据数组方面与指针一样好(如果不比指针更好)。
- 我的C ++很糟糕。 ^_^
- 执行时间的更好测试将是迭代,而不是递归。
我尝试编写一个更简单的程序,它不使用指针(或Java等价物中的数组),并且其执行非常直接。即使如此,Java的执行速度也比C++的执行速度更快。我做错了什么?
代码:
Java:
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:
我使用新的round函数更改了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++编译所有的代码,并最终获得我算法所需的速度。 :)
round
函数与Math.round(double)
不同。 - Mat