开销-从c#调用c++函数
Overhead - Calling C++ function from C#
我正在从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上调用总是会有固定的开销:
每个https://msdn.microsoft.com/en-us/library/ms235282.aspxPInvoke的开销在10到30个x86指令之间呼叫除了这个固定成本之外,封送处理还会产生额外的开销。在可写入类型之间没有封送成本在托管和非托管代码中具有相同的表示。为例如,在int和Int32之间进行转换没有成本。
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用不带参数的函数访问结构元素
- 代码在main()中运行,但在函数中出现错误
- 内置函数可查看CPP中的成员变量
- 如何获取std::result_of函数的返回类型
- 如何在c++中为模板函数实例创建快捷方式
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗