1

我正在从 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% 的开销吗??

更新1:

对于 C# 的每个函数调用,函数 ID 都需要发送到 C++。C++ 函数不是空函数。它需要将函数 ID 存储在 STL 中,然后另一个线程将处理它。我正在做一个 .NET 分析器之类的事情。我需要分析每个函数调用。这个 FuncA C++ 函数将从注入的辅助函数中调用。

谢谢,

./拉胡尔

4

2 回答 2

1

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

于 2015-06-09T08:10:00.747 回答
0

C++ 函数有什么作用?它真的是一个空方法吗?它是你要执行的一系列动作中的必要步骤吗?

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

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

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

于 2015-06-09T07:42:37.610 回答