我的C ++标题中有一个dll函数:
DLLEXPORT void __stdcall MultiplyQuaternions(double* a, double* b, double* c);
a
和b
是两个包含四元数x,y,z和w分量的4元素数组。
c
是生成的四元数。
从c ++调用此函数时,运行速度非常快。
从C#im原型设计功能如下:
[DllImport("Intrinsics.dll", EntryPoint = "?MultiplyQuaternions@@YAXPEAN00@Z", ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)]
private static extern void MultiplyQuaternions(double* a, double* b, double* c);
调用就像这样:
fixed (double* q1ptr = q1Vals, q2ptr = q2Vals, resPtr = resVal)
{
MultiplyQuaternions(q1ptr, q2ptr, resPtr);
}
它有效,但性能很糟糕。从c#发出的相同工作量大约是c ++的50倍。 我能在这做什么任何提示都非常感谢。提前谢谢!
答案 0 :(得分:1)
我将从[SuppressUnmanagedCodeSecurity]
及相关属性开始。 IIUC,默认情况下,当您调用非托管代码时,执行堆栈遍历以确保导致该调用的所有内容都有权将调用转换为非托管代码。每次调用非托管代码时都会进行此检查,并且可以相加。
编辑:我还会考虑使用extern 'C'
或其他方法来消除名称错位。寻找MultiplyQuaternions
比查找?MultiplyQuaternions@@YAXPEAN00@Z
更容易,您不必担心将来签名格式发生变化的可能性。