我从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 ++函数的其他方法是什么?
答案 0 :(得分:8)
您可以尝试添加SuppressUnmanagedCodeSecurityAttribute
。
允许托管代码在没有堆栈遍历的情况下调用非托管代码。
https://msdn.microsoft.com/en-us/library/system.security.suppressunmanagedcodesecurityattribute.aspx
但是在p / invoke调用中总是会有固定的成本开销:
PInvoke的开销为每个10到30 x86指令 呼叫。除了固定成本之外,编组还可以创造额外的成本 高架。 blittable类型之间没有编组成本 在托管代码和非托管代码中具有相同的表示形式。对于 例如,在int和Int32之间进行转换没有成本。