从C#优化C ++调用

时间:2015-06-09 07:28:32

标签: c# c++ .net interop clr-profiling-api

我正在调用来自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

2 个答案:

答案 0 :(得分:1)

作为一个远景,您可以创建一个托管C ++ CLI静态库,该库调用非托管C ++函数,降低性能,并添加为C#项目中C ++ / CLI库的引用。然后,C#应用程序可以对链接的C ++ CLI库进行托管方法调用,这反过来可以进行非托管方法调用。虽然这会导致一些间接性,但它可能会提高性能。

答案 1 :(得分:0)

C ++功能有什么作用?它真的是一个空方法吗?这是您执行行动链中的必要步骤吗?

将此方法重写为C#或将其合并到工作流程中可能会更快,而无需调用外部(可能是不安全的)方法。

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

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