从C#优化C ++调用

问题描述 投票:1回答:2

我从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# c++ .net interop clr-profiling-api
2个回答
1
投票

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


0
投票

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.