开销-从c#调用c++函数

Overhead - Calling C++ function from C#

本文关键字:c++ 函数 调用 开销      更新时间:2023-10-16

我正在从c#调用两个c++函数。在对大约100万次调用进行迭代时,我看到了大约30%的开销。

c++函数:
EXTERN_C void STDAPICALLTYPE FunctionA(UINT_PTR mathId)
{
    ...
    ...
}

在我的c#程序集dll中:

[DllImport("CPlusPlus.dll")]
    public static extern void FunctionA([In] IntPtr mathID);

从函数调用,如下所示:

 public static void HelpingFunction([In]UInt64 mathID)
    {
        FunctionA((IntPtr)mathID);
    }

当"HelpingFunction"被调用超过一百万次时,这种实现方式会产生更多的开销。

谁能给我其他的想法,这样可以减少开销?从c#程序集调用c++函数还有其他的方法吗?

您可以尝试添加SuppressUnmanagedCodeSecurityAttribute

允许托管代码调用不需要堆栈遍历的非托管代码。

https://msdn.microsoft.com/en-us/library/system.security.suppressunmanagedcodesecurityattribute.aspx

但是在p/invoke上调用总是会有固定的开销:

每个

PInvoke的开销在10到30个x86指令之间呼叫除了这个固定成本之外,封送处理还会产生额外的开销。在可写入类型之间没有封送成本在托管和非托管代码中具有相同的表示。为例如,在int和Int32之间进行转换没有成本。

https://msdn.microsoft.com/en-us/library/ms235282.aspx