繁体   English   中英

从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 ++函数将从注入的帮助器函数中调用。

谢谢,

./Rahul

从长远来看,您可以创建一个托管C ++ CLI静态库,该静态库调用性能较低的非托管C ++函数,并在C#项目中添加对C ++ / CLI库的引用。 然后,C#应用程序可以对链接的C ++ CLI库进行托管方法调用,而C ++ CLI库又可以进行非托管方法调用。 尽管这会导致某种间接影响,但可能会提高性能。

C ++函数做什么? 真的是空方法吗? 这是您执行动作链中的必要步骤吗?

也许将这种方法重写为C#以便将其合并到那里的工作流程中更快,而不必调用外部(可能是不安全的)方法。

如果C ++代码执行的操作与其余流程无关,则也许可以通过让它在后台工作程序或单独的线程中运行来赢得一些时间,因此您的C#代码不必等待代码运行。 我想这可能是一个有效的选项,因为您的方法返回void。

也许更多有关为什么以及如何帮助我们找到更合适答案的信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM