从托管代码调用非托管代码的性能

时间:2011-09-30 10:56:28

标签: c# performance

我有一个win32 dll和两个使用相同dll的应用程序。一个是在非托管空间中使用c编写的,另一个是使用Pinvokes调用非托管代码的.net应用程序。

.net应用程序的性能有时优于c应用程序。从技术上讲,从.net调用非托管代码会产生性能开销,但在这种情况下不会。

我检查了msdn引用,似乎在实际调用之前会发生某种预处理。在链接期间,加载了dll。

我想了解在什么情况下.net应用程序优于哪些?

1 个答案:

答案 0 :(得分:5)

pinvoke marshaller是.NET框架中最重的优化代码块之一。非常重要的是,在非托管操作系统上运行托管程序时,您无法看到许多pinvoke。开销量变化很大。当DLL已经加载并且pinvoked函数的参数是简单的整数类型时,它只是少数几个cpu周期。比如,字符串转换是必要的,需要数百个周期。

在任何情况下,它都不会比原生呼叫更快。准确地测量仅仅少数几个周期的开销是困难的。请记住,您可能会无意中测量测试程序的性能而不是pinvoke调用。