2010-10-29 47 views
3

我有一个关于C++/CLI与本机C++速度的问题。我写了一个小测试应用程序,我看到非常令人惊讶的结果。本机C++与C++/CLI速度

看来,非托管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 

输出托管代码与编译管理(推,关闭):

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

你是说在VS2005 C++/CLI快于它在VS2008? – Gabe 2010-10-29 01:53:28

回答

3

您可能会遇到的一件事情是,对于本机C++,优化由编译器的命令行参数控制,但对于托管代码,优化则由您如何启动应用程序来控制(即,如果在调试器中启动,即使您进行了优化构建,也会禁用许多优化)。 “你不应该在”Visual Studio“中运行性能测试。

本地编译器也有很多额外的优化。它甚至可能足够聪明地发现dBalance严格增加,并且一旦dBalance > 22000.0没有可观察到的副作用,则继续内循环。

如果您像这样更改内部for循环(只会执行17次迭代,只要numberOfYears >= 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; 
}