与普通的 p/Invoke 调用相比,使用不安全的 P/Invoke 调用是不是有性能优势?
Posted
技术标签:
【中文标题】与普通的 p/Invoke 调用相比,使用不安全的 P/Invoke 调用是不是有性能优势?【英文标题】:Is there a performance advantage in using unsafe P/Invoke calls over normal p/Invoke calls?与普通的 p/Invoke 调用相比,使用不安全的 P/Invoke 调用是否有性能优势? 【发布时间】:2011-04-25 20:43:31 【问题描述】:我希望使用 P/Invoke 允许我的 C# 程序集与本机 C 库进行互操作;这需要是跨平台的(即 Mono),因此不能使用混合模式程序集。我想知道使用不安全的 P/invoke 调用是否有任何性能优势,并在不安全的方法中处理所有指向指针的转换,而不是进行典型的“安全”P/Invoke 调用。提前致谢!
澄清: 正如here 所讨论的那样,我不打算使用托管 C++ 包装器。我只是想知道以下之间是否存在性能差异:
extern static void native_call_here(IntPtr parameter1, String parameter2)
和
extern static void native_call_here(int* parameter1, char* parameter2)
【问题讨论】:
可能重复:***.com/questions/1433334/… 感谢您的链接 - 我实际上是在发帖的路上调查过的。该用户要求 P/Invoke 调用和托管 C++ 包装器之间的性能差异。我正在寻找两种不同风格的 P/Invoke 之间的性能差异。 啊,没听懂,抱歉。很高兴它很有用。 【参考方案1】:将在某个时候进行编组。在前一种情况下,一旦您调用 PInvoke 方法,就会发生编组。在后一种情况下,由于您是从不安全的代码中调用的,因此您可以控制封送处理发生的时间/方式。如果您在不安全的代码中使用非托管内存执行多项操作,这可能会带来好处,但如果它只是传递数据,那么您所做的一切都会转移到发生编组的位置。如果有的话,我希望 PInvoke 在这种情况下会更快,但是,如果重要的话,一如既往地对其进行分析。
【讨论】:
以上是关于与普通的 p/Invoke 调用相比,使用不安全的 P/Invoke 调用是不是有性能优势?的主要内容,如果未能解决你的问题,请参考以下文章
.Net调用非托管代码(P/Invoke与C++InterOP)
[.NET] 平台调用(P/Invoke) 与 DllImport 使用的相关讲解与注意事项,