gpt4 book ai didi

c++-cli - native C++ 与 C++/CLI 速度

转载 作者:行者123 更新时间:2023-12-01 14:24:05 27 4
gpt4 key购买 nike

我有一个关于 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 managed(push, off) 输出托管代码:

Called
Time Elapsed: 24516
Number of random: 20000000

输出 native 代码:

Called
Time Elapsed: 2156
Number of random: 20000000

在主电源中,只需调用指定 90 年的 GrowBalance。非常基本的测试。是我做错了什么,还是我真的在看使用 C++/CLI 会慢 4.5 倍的代码。而且我也不明白关闭托管代码的情况。我读过的所有内容都说这会将代码编译为 native C++,但速度非常慢。对此的任何帮助将不胜感激。

更新:我只是在 visual studio 2005 而不是 2008 中运行了这个测试。 native C++ 性能是匹配的。

更新#2:我只是将我的测试代码放入一个类而不是单个函数中,并且得到了更好的结果。现在混合代码的平均运行时间约为 5000 毫秒

但在 2005 年,我看到了更快的结果。平均运行时间约为 1875 毫秒。也许我会坚持使用 2005 来进行 CLI 开发。除非有人知道为什么会发生这种情况。

最佳答案

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

native 编译器还有很多额外的优化。它甚至可能足够聪明地弄清楚 dBalance 是严格增加的,并且一旦 dBalance > 22000.0 没有可观察到的副作用就继续内部 for 循环。

如果您像这样更改内部 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;
}

关于c++-cli - native C++ 与 C++/CLI 速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4048184/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com