在Win32 / COM方法上调用PInvoke时,通常会有明显的性能损失吗?

时间:2011-04-08 08:37:23

标签: .net performance pinvoke marshalling dllimport

我想知道是否有人对托管.Net代码在Win32方法上使用DLLImport / PInvoke的消极方面有一个不错的解释或概述?

我计划使用各种Win32方法,并希望对这样做的负面影响有更深入的了解。

谢谢,

布赖恩。

2 个答案:

答案 0 :(得分:33)

根据MSDN - Calling Native Functions from Managed Code

  

PInvoke每次调用的开销为10到30 x86。除了这个固定成本之外,编组还会产生额外的开销。在管理和非托管代码中具有相同表示的blittable类型之间没有编组成本。例如,在int和Int32之间进行转换没有任何成本。

根据我的经验,当P /调用本机函数时肯定存在开销,但通常性能损失不值得担心。编组成本是需要记住的。如果你传递大型结构,字符串等,那么性能成本将很快显示出来。

对于频繁调用的P / Invoked函数,您可能需要考虑将[SuppressUnmanagedCodeSecurity]添加到P / Invoke函数定义中(请参阅MSDN - SuppressUnmanagedCodeSecurityAttribute)。这会阻止运行时执行堆栈遍历以确保调用方具有UnmanagedCode权限。当然,请确保在添加此属性之前了解安全性后果。

答案 1 :(得分:3)

以下是我在PInvoke中看到的一些问题:

  • 参数封送可能很昂贵,具体取决于数据类型(blittable / non-blittable)
  • 正确的参数编组通常不是很直观
  • PInvoke不提供任何编译时安全性。在没有编译器抱怨的情况下,可以轻松地拼错DLL或函数名称。

如果你计划使用大量非托管函数,我会创建一个混合DLL(http://msdn.microsoft.com/en-us/library/x0w2664k.aspx),而不是声明一堆PInvokes。