2017-05-07 22 views
2

我即将开始我的新项目。我一直在使用C++(使用Qt)和C#。所以我非常熟悉这两种语言。性能 - 如何将C-sharp和C++对性能的影响联系起来?

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

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

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

最好的问候, Samarth Saxena。

+0

请指定'前端'和'后端'的含义。在某些(流行)环境中,它们只是客户端和服务器端,在这种情况下,语言的差异根本无关紧要。 –

回答

2

互操作层的性能足够好,它不会改变整体性能 - 这将取决于您编写代码的程度,您是否做无用的副本,在应该是循环时连接字符串使用StringBuilder等

但是,对于p/invoke和COM interop,成本不是零,所以你想避免chatty接口(例如互操作调用应该用整个数组填充缓冲区,而不是强迫你为每个项目进行ap/invoke调用)。

与纯C#相比,最终的互操作方法C++/CLI“It Just Works”实际上可能会带来负面成本。这是因为它是.NET运行时在内部使用的方法(每当mscorlib.exe中的元数据标记为internalcall),并且如果将C++/CLI代码添加到项目中,.NET本身内部的托管/本地转换比它增加时更多,它将省时间。

+0

顺便说一句,该方案将跨平台? –

+0

@SamarthSaxena:C++部分可以是部分C++/CLI和部分标准C++,而标准C++可以是跨平台的。另外,由C++/CLI编译器创建的混合模式DLL可以在其他一些平台上运行,例如在Linux上使用Mono + Wine组合。但是在非Windows平台上,只有少数.NET功能可以像在.NET Framework上那样工作。 –

1

如果你使用微软的C++的“DotNet”风格,你会没事的。如果你使用C#编写所有东西,或者使用C++编写所有东西,性能通常会更好。这是因为两种语言都将以“托管”模式运行,并且它们将共享相同的运行时。 (Dot Net运行时)。

但是,如果您想要使用托管C#与良好的旧常规(非托管/本机)C++,则会由于所有托管到本地以及在两者之间进行调用时需要执行的本地到受管理的转换,以及这意味着所有数据的编组。

Google对于“pinvoke”来看看人们为了从C#调用C++而必须经历的痛苦。尽管如此,“pinvoke”存在是非常酷的,它使事情变得相对容易。

+1

C++/CLI可以在没有p/invoke开销并且没有任何自动封送的情况下进行托管/本地转换。 C#本身会导致很多托管/本地转换,因为大部分CLR都是用本机代码编写的。所以没有必要在“托管”模式下运行C++来获得好处。 –

+0

我同意@BenVoigt只要我了解了C++和CSharp。顺便说一句,同样的问题给你的人;该计划是跨平台的吗? –

+0

@BenVoigt我没有说C++在调用native时需要编组。我说C#在调用本地C++时需要编组。 –