我正在从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。
也许更多的关于为什么和如何的信息可以帮助我们找到一个更合适的答案。