从c#优化c++调用
Optimizing C++ call from C#
我正在从c#调用两个c++函数调用,我的代码如下:
[DllImport("A.dll", CallingConvention = CallingConvention.StdCall, EntryPoint = "FuncA"), System.Security.SuppressUnmanagedCodeSecurity]
public static extern void FuncA(UInt64 functionID);
在c++代码中是:
EXTERN_C void STDMETHODCALLTYPE FuncA(UINT_PTR functionId)
{
return;
}
这个函数从c#到c++被调用了大约200万次。没有这个函数调用,我的web请求在5.9秒内完成。这个函数调用,我得到7.1秒…
大约15%的开销。我已经使用了"SuppressUnmanagedCodeSecurity"通过看到一个帖子,这将开销从30%减少到15%。但是还有其他方法可以减少这15%的开销吗?
Update1:
c#的每个函数调用都需要将函数ID发送给c++。c++函数不是空函数。它需要将函数id存储在STL中,另一个线程将处理它。我正在做。net分析器之类的事情。我需要分析每一个函数调用。这个FuncA c++函数将从注入的辅助函数中调用。
谢谢,
。/拉胡尔
作为一个长期目标,你可以创建一个托管的c++ CLI静态库,它调用性能较低的非托管c++函数,并将其添加到c#项目中的c++/CLI库中作为参考。然后,c#应用程序可以对链接的c++ CLI库进行托管方法调用,而c++ CLI库又可以进行非托管方法调用。虽然这会产生一些间接影响,但它可能会提供一些性能提升。
c++函数是做什么的?它真的是一个空方法吗?这是你一系列行动中必要的一步吗?
也许将此方法重写为c#更快,将其合并到那里的工作流中,而不必调用外部(可能不安全的)方法。
如果c++代码执行的动作与流的其余部分无关,也许你可以通过让它在后台工作线程或单独的线程中运行来赢得一些时间,这样你的c#代码就不必等待代码运行。我想这可能是一个有效的选项,因为你的方法返回void。
也许更多的关于为什么和如何的信息可以帮助我们找到一个更合适的答案。
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在c++类上调用void函数
- 为什么 std::unique 不调用 std::sort?
- 调用专用模板时出错"no matching function for call to [...]"
- 选择要调用的构造函数
- C++为什么尽管我调用了void函数,它却不起作用
- 构造函数正在调用一个使用当前类类型的函数
- 变量没有改变?通过向量的函数调用
- 没有为自己的结构调用列表推回方法
- 调用'begin(int [n])'没有匹配函数
- 什么时候调用析构函数
- 如何用参数值调用函数(仅在运行时已知)
- std::cout.imbue()多重调用
- 函数何时会在c++中包含stack_Unwind_Resume调用