与普通的 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 使用的相关讲解与注意事项,

[.NET] 平台调用(P/Invoke) 与 DllImport 使用的相关讲解与注意事项,

C#高阶与初心:P/Invoke平台调用

P/Invoke:内存损坏与指针

如何使用 p/invoke 终止从 C# 调用的 C++ 函数