本机C ++与C ++ / CLI速度

时间:2010-10-29 00:32:18

标签: c++-cli

我有一个关于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开发。除非有人知道为什么会发生这种情况。

1 个答案:

答案 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;
}