从托管代码中调用非托管代码的性能表现

5
我有一个win32动态链接库和两个应用程序使用相同的dll。其中一个是使用c语言编写的非托管空间应用程序,另一个是使用Pinvokes调用非托管代码的.net应用程序。
有时候,.net应用程序的性能比c应用程序更好。严格来说,从.net调用非托管代码会产生性能开销,但在这种情况下不会。
我查看了MSDN参考文献,似乎在实际调用之前会进行某种预处理。在链接过程中加载dll。
我想了解在哪些情况下.net应用程序的性能优于其它应用程序?

2
你如何衡量这两个应用程序的性能,而且这两个应用程序的其他逻辑完全相同吗? - Avada Kedavra
1
一般来说,本地调用应该更快,请看这个链接:http://www.codeproject.com/KB/dotnet/pinvokeperformance.aspx 你确定测量是正确的吗? - Alex F
@AvadaKedavra - 我使用秒表和 .net 和 c 应用程序的时间来测量特定方法的调用。 - sundar
1个回答

5
PInvoke marshaller是.NET框架中最优化的代码之一。非常重要的是,在未经管理的操作系统上运行托管程序时,有很多PInvoke是看不到的。开销的数量高度可变。当DLL已经加载并且调用函数的参数是简单整型时,它只需要少量的CPU周期。当需要进行字符串转换时,这个时间会增加到数百个周期。
在任何情况下,它都不可能比本地调用更快。准确测量只有少量周期的开销是困难的。请记住,您可能会无意中测量测试程序而不是PInvoke调用的性能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接