C# 性能-如何连接C-sharp和C++;对性能的影响?

C# 性能-如何连接C-sharp和C++;对性能的影响?,c#,c++,windows,performance,qt,C#,C++,Windows,Performance,Qt,我正要开始我的新项目。我一直在使用C++(使用Qt)和C#。所以我对这两种语言都很熟悉 我一直使用它们,C++用于Windows和C++,用于跨平台应用程序。但这次我想做些不同的事情。我想把它们联系起来并一起使用 我将使用C++语言进行GUI开发和C++后端。 现在,我只想知道这将如何影响我的应用程序的性能? 致以最良好的祝愿, Samarth Saxena。 < P>如果你使用微软的“点网”C++的味道,你会很好。如果你用C语言写的东西或者C++中的所有东西,性能通常会是好的。这是因为两种语言

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

<>我一直使用它们,C++用于Windows和C++,用于跨平台应用程序。但这次我想做些不同的事情。我想把它们联系起来并一起使用

我将使用C++语言进行GUI开发和C++后端。 现在,我只想知道这将如何影响我的应用程序的性能?

致以最良好的祝愿, Samarth Saxena。

< P>如果你使用微软的“点网”C++的味道,你会很好。如果你用C语言写的东西或者C++中的所有东西,性能通常会是好的。这是因为两种语言都将在“托管”模式下运行,并且它们将共享相同的运行时。(dotnet运行时。)

但是,如果您想使用具有良好的旧规则(非托管/本地)C++的托管C语言,则会有一定的性能损失,因为所有托管的本地和本地托管托管转换都需要在两个调用之间进行,并且所有数据的编组都暗示了这一点。


谷歌为“P援引”看人们要经历的痛苦是什么,从C++调用C++。尽管如此,“pinvoke”的存在还是很酷的,它使事情变得相对简单。

互操作层的性能足够好,不会改变总体性能——这将取决于您编写代码的能力,是否进行了无用的复制,在应该使用StringBuilder时将字符串串联在循环中,等等

尽管如此,p/invoke和COM互操作的成本并不是零,因此您希望避免聊天界面(例如,互操作调用应该用整个数组填充缓冲区,而不是强制您对每个项进行p/invoke调用)


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

请指定您所说的
前端
后端
是什么意思。在某些(流行的)上下文中,它们只是指客户端和服务器端,在这种情况下,语言的差异根本不重要。C++/CLI可以执行托管/本机转换,而无需p/invoke开销和任何自动封送。C#本身会导致许多托管/本机转换,因为CLR的大部分都是用本机代码编写的。因此,在“托管”模式下运行C++不必获得好处。只要我已经学习了C++和cPACK,我就同意@ BeoVigt。顺便问你同样的问题,伙计;这个程序是跨平台的吗?@ Beoviigt我没有说C++在调用本地时需要编组。我说C++调用本地C++时需要编组,现在,关于“在管理模式中不必运行C++来获得好处”的语句,当每个托管对象都需要固定或在本机访问时可能会移动时,如何在没有开销的情况下完成托管/本机转换?C++/CLI代码仍然会遇到在本机调用之前必须固定的情况,但它比p/invoke更有效。例如,在同一阵列上进行三次连续调用时,C++/CLI可以锁定一次并进行三次调用。p/invoke将为这三个节点中的每一个进行pin和unpin。这对于字符串来说尤其重要,因为C++/CLI可以转换Unicode -> ASCII一次,并进行多个调用,而C++则重复对每个单调用/调用调用的Unicode转换。BTW将该程序是跨平台的吗?@ SamarthSaxena:C++块可以部分地是C++ +CLI,部分是标准C++。标准C++可以跨平台。此外,C++/CLI编译器创建的混合模式DLL可以在其他一些平台上运行,例如在Linux上使用Mono+Wine组合。但只有少数.NET功能在非Windows平台上能像在.NET Framework上一样工作。