interop之C++/CLI 中的 #pragma managed(push,off) 是否影响性能
我正在为 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。
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。