【问题标题】:Performance - How does linking C-sharp and C++ effect on Performance?性能 - 链接 C-sharp 和 C++ 对性能有何影响?
【发布时间】:2017-05-07 17:53:18
【问题描述】:

我即将开始我的新项目。我一直在使用 C++(使用 Qt)和 C#。所以我对这两种语言都非常熟悉。

我一直将它们分开使用,C# 用于 Windows,C++ 用于跨平台应用程序。但这一次我想做一些不同的事情。我想将它们链接起来并一起使用。

我将使用 C# 进行 GUI 开发和 C++ 后端。

那么现在,我只想知道这将如何影响我的应用程序的性能?

最好的问候, Samarth Saxena。

【问题讨论】:

  • 请说明front-endBackend 的含义。在某些(流行的)上下文中,它们仅表示客户端和服务器端,在这种情况下,语言差异根本不重要。

标签: c# c++ windows performance qt


【解决方案1】:

互操作层的性能足够好,不会改变整体性能——这取决于你编写代码的好坏,是否做无用的副本,在你应该使用的时候将字符串连接在一个循环中字符串生成器等

尽管如此,p/invoke 和 COM 互操作的成本不是零,因此您希望避免繁琐的接口(例如互操作调用应该用整个数组填充缓冲区,而不是强迫您进行 ap/invoke 调用每个项目)。

最终的互操作方法,C++/CLI “It Just Works”,与纯 C# 相比,实际上可能会产生负成本。这是因为它是 .NET 运行时在内部使用的方法(只要 mscorlib.exe 中的元数据具有 internalcall 标志),并且如果将 C++/CLI 代码添加到您的项目中,则在 .NET 本身中保存的托管/本机转换比它更多补充一下,这样会节省时间。

【讨论】:

  • 顺便说一句,该程序会跨平台吗?
  • @SamarthSaxena:C++ 部分可以部分是 C++/CLI,部分是标准 C++,标准 C++ 可以是跨平台的。此外,由 C++/CLI 编译器创建的混合模式 DLL 可以在其他一些平台上运行,例如在 Linux 上使用 Mono+Wine 组合。但只有少数 .NET 功能在非 Windows 平台上的运行效果与在 .NET Framework 上一样好。
【解决方案2】:

如果您使用 Microsoft 的“Dot Net”风格的 C++,就可以了。性能通常会与使用 C# 或 C++ 编写所有内容一样好。这是因为两种语言都将在“托管”模式下运行,并且它们将共享相同的运行时。 (点网运行时。)

但是,如果您想将托管 C# 与良好的旧常规(非托管/本机)C++ 一起使用,由于所有托管到本机和本机到托管的转换,您将面临一定的性能损失。在两者之间进行调用时需要完成,以及这暗示的所有数据编组。

Google 搜索“pinvoke”,看看人们为了从 C# 调用 C++ 必须经历哪些痛苦。尽管如此,“pinvoke”的存在还是很酷的,它让事情变得相对容易。

【讨论】:

  • C++/CLI 可以在没有 p/invoke 开销和任何自动编组的情况下进行托管/本机转换。 C# 本身会导致许多托管/本机转换,因为 CLR 的大部分是用本机代码编写的。所以没有必要在“托管”模式下运行 C++ 来获得好处。
  • 我同意@BenVoigt 只要我了解了 C++ 和 CSharp。顺便说一句,对你来说同样的问题;该程序会跨平台吗?
  • @BenVoigt 我没有说 C++ 在调用本机时需要编组。我说过 C# 在调用原生 C++ 时需要编组。
  • 现在,关于“不必在管理模式下运行 C++ 以获得好处”的声明,当每个托管对象需要固定或否则它可能会在原生访问它时移动?
  • C++/CLI 代码仍将面临在本机调用之前必须固定的情况,但它比 p/invoke 更有效。例如,对同一个数组进行三个连续调用,C++/CLI 可以 pin 一次并进行三个调用。 p/invoke 将为这三个中的每一个固定和取消固定。这对字符串尤其重要,因为 C++/CLI 可以一次转换 Unicode -> ASCII 并进行多次调用,而 C# 为每个 p/invoke 调用重复与 Unicode 的转换。
猜你喜欢
  • 2019-09-04
  • 1970-01-01
  • 2015-03-04
  • 1970-01-01
  • 2017-07-23
  • 2021-04-20
  • 2011-04-15
  • 1970-01-01
相关资源
最近更新 更多