我有一个关于C ++ / CLI与Native C ++速度的问题。我写了一个小测试应用程序,我看到非常令人惊讶的结果。
似乎非托管C ++ / CLI代码明显变慢。基本上我创建了两个控制台应用程序一个标准的win32控制台应用程序和一个CLR控制台应用程序
以下是我为测试所做的代码。我在所有版本的测试中保持代码完全相同。
const int NumberOfTests = 10000000;
void GrowBalance(int numberOfYears)
{
std::cout<<"Called"<<std::endl;
DWORD startTime = GetTickCount();
int numberOfRandom = 0;
for(int i = 0; i < NumberOfTests; i++)
{
double dBalance = 10000.0;
for(int year = 0; year < numberOfYears; year++)
{
dBalance *= 1.05;
if(dBalance > 20000.00 && dBalance < 22000.00)
{
numberOfRandom++;
}//if
}//for
}//for
DWORD endTime = GetTickCount();
std::cout<<"Time Elapsed: "<<endTime - startTime<<std::endl;
std::cout<<"Number of random: "<<numberOfRandom<<std::endl;
}
输出托管代码:
Called
Time Elapsed: 9937
Number of random: 20000000
使用pragma托管(推送,关闭)输出托管代码:
Called
Time Elapsed: 24516
Number of random: 20000000
输出本机代码:
Called
Time Elapsed: 2156
Number of random: 20000000
在指定90年的电源中调用GrowBalance。非常基本的测试。有什么我做错了或者我真的在看使用C ++ / CLI会慢4.5倍的代码。而且我也不理解关闭托管代码的情况。我读过的所有内容都表示这会将代码编译为原生C ++,但速度却非常慢。任何有关这方面的帮助将非常感激。
更新 我刚刚在visual studio 2005而不是2008中运行了这个测试。本机C ++的性能是匹配的。
更新#2: 我只是将我的测试代码放入一个类而不是单个函数中,并且得到了更好的结果。现在,混合代码在平均运行时间~5000ms
进行预编码但是在2005年,我看到了更快的结果。平均运行时间约为1875毫秒。也许我会坚持2005年的CLI开发。除非有人知道为什么会发生这种情况。
答案 0 :(得分:3)
您可能遇到的一件事是,对于本机C ++,优化由编译器的命令行参数控制,但对于托管代码,优化由您启动应用程序的方式控制(即,如果您在调试器中启动,即使您进行了优化构建,也会禁用许多优化。您根本不应该在Visual Studio中运行性能测试。
本机编译器还有很多额外的优化。甚至可能很聪明地发现dBalance
严格增加,并且dBalance > 22000.0
没有可观察到的副作用,继续内部for循环。
如果你像这样改变内部for循环,那么在所有三种情况下会发生什么(只要numberOfYears >= 17
只进行17次迭代)?
double dBalance = 10000.0;
for(int year = 0; year < numberOfYears && dBalance < 22000.0; year++)
{
dBalance *= 1.05;
if(dBalance > 20000.0)
{
numberOfRandom++;
}//if
}//for
怎么样:
if (numberOfYears > 14) {
double dBalance = 19799.315994393973883056640625;
for(int year = 14; year < numberOfYears && dBalance < 22000.0; year++)
{
dBalance *= 1.05;
numberOfRandom++;
}//for
}
怎么样:
if (numberOfYears > 14) {
numberOfRandom += (numberOfYears >= 17)? 3: numberOfYears - 14;
}