仅使用原始类型的本机互操作的开销

Nol*_*rin 4 .net c performance pinvoke interop

我正在考虑将我的C#项目中的一小部分代码移植到C/ASM以获得性能优势.(这部分代码使用了许多按位操作,并且是使用本机代码可能存在实际性能提升的少数几个地方之一.)然后,我计划通过P/Invoke简单地在单独的DLL中调用本机函数.现在,将在托管代码和本机代码之间传递的唯一数据将是纯粹的原始类型(bool,int,long,1D数组等).所以我的问题是:使用P/invoke只需要原始类型就会有任何显着的开销吗?我知道在使用更复杂的类型时存在一个次要的开销,因为它们需要被编组(固定/复制),但也许在我的情况下它会相对有效(相比从本机DLL本身调用代码甚至)?如果有人能为我澄清这个问题,解释性能优势/点击的程度以及它们背后的原因,我们将非常感激.完成整个任务的另一种方法也是受欢迎的,但由于C#缺乏对内联汇编/ CIL的支持,我不相信有一个.

Jim*_*old 5

来自MSDN(http://msdn.microsoft.com/en-us/library/aa712982.aspx):

"PInvoke每次调用的开销在10到30 x86之间.除了这个固定成本之外,编组还会产生额外的开销.在托管和非托管代码中具有相同表示的blittable类型之间没有编组成本.例如,那里在int和Int32之间进行翻译是没有成本的."

因此,它相当便宜,但一如既往,您应该仔细测量,以确保您从中受益,并牢记任何维护费用.顺便说一句,我建议在P/Invoke上使用C++/CLI("托管"C++)进行任何复杂的互操作,特别是如果你对C++感到满意的话.