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

cloudgamer 阅读:9 2024-10-01 17:34:08 评论:0

我正在为 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


标签:C++
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号