gpt4 book ai didi

interop - C++/CLI 中的 #pragma managed(push,off) 是否影响性能?

转载 作者:行者123 更新时间:2023-12-01 10:55:17 25 4
gpt4 key购买 nike

我正在为 C# 编写一个 DLL 作为高性能模块,所以我使用 C++/CLI,因为它很容易在 C# 中引用并支持 native 代码。我在 msdn 上找到了使用#pragma managed(push, off) 和#pragma managed(pop) 可以使其中的代码编译为 native 代码。但根据我的简单测试,结果却恰恰相反。

这是使用 Visual Studio 2012 使用/clr 编译的代码。

int clrloop()
{
for (int i = 0; i < 999999999; i++)
{
double test=9.999;
test=pow(test, 10);
}
return 0;
}

#pragma managed(push,off)
int loop()
{
for (int i = 0; i < 999999999; i++)
{
double test=9.999;
test=pow(test, 10);
}
return 0;
}
#pragma managed(pop)

int main(array<System::String ^> ^args)
{
int a=loop();
int b=clrloop();
return 0;
}

性能分析表明,非托管 loop() 的成本是 clrloop() 的两倍。但是,如果我将 loop() 放入不同的 .cpp 文件中,并设置这个使用/clr 编译的单个文件,并且不使用任何 #pragma managed(push, off) 东西,结果会如预期的那样好。

那么,这个#pragma 有什么问题?

最佳答案

我自己找到答案,所以,我来回答。

问题是由函数 pow() 引起的。

pow() 所在的 math.h 只是简单地包含而没有任何预处理器指令,这意味着它只是作为托管编译的。因此,非托管 loop() 将不得不调用托管 pow(),从而成为从托管 main() 到非托管 loop()、托管 pow() 的三步跳,并导致开销。解决方案是用 #pragma managed(push, off) 和 #pragma managed(pop) 包含 math.h

关于interop - C++/CLI 中的 #pragma managed(push,off) 是否影响性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15518788/

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