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

时间:2015-05-18 14:33:06

标签: c# c++ pinvoke marshalling

我从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 ++函数的其他方法是什么?

1 个答案:

答案 0 :(得分:8)

您可以尝试添加SuppressUnmanagedCodeSecurityAttribute

  

允许托管代码在没有堆栈遍历的情况下调用非托管代码。

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

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

  

PInvoke的开销为每个10到30 x86指令   呼叫。除了固定成本之外,编组还可以创造额外的成本   高架。 blittable类型之间没有编组成本   在托管代码和非托管代码中具有相同的表示形式。对于   例如,在int和Int32之间进行转换没有成本。

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