2009-12-07 89 views
1

我很早就开始使用纯C语言,然后转到C++,现在我正面临C++/CLI。作为一个性能怪胎,我总是试图将最后一滴性能压缩到每一行代码。我目前正在一个项目中合理地完成VB.Net(简单性,资源可用性等),但有几点非常敏感,我打算在C++/CLI中执行这些部分。但是,只有一小部分可以从托管代码中取出,而其余部分则需要保持管理。问题是,与C#或VB.Net相比,编写C++/CLI托管函数是否会带来性能上的提升?从我读过的文档中我可以理解的,唯一的好处似乎是托管/非托管thunk更轻。是这样吗?因为我甚至不能似乎能够存储在非托管数组或结构手柄(我可以操纵更快),如:C++/CLI性能增益

String^mystr = "Oh, my!"; 
Object^myarray[10]; 
myarray[0] = mystr; // Can't event be casted to void*, int, HANDLE... 
// (however, handles do have a sizeof() == 4 in Win32) 
// (I don't expect the handle to behave like a pointer; just stay as handle) 

回答

0

使用C++/CLI可以看到的唯一性能提升是混合本机代码和托管代码的地方。 C++/CLI允许您以比VB.Net更少的开销调用性能关键部分代码的本机方法。我不会建议在本地和本地之间进行切换,因为仍然存在惩罚,但将控制权交给本地代码以处理大量与性能相关的代码是可以接受的。

+0

谢谢。虽然我仍然需要描述它的实际开销是多少,但我知道有关开销。 – 2009-12-07 18:59:08

1

有没有性能上的优势作为C++/CLI编译成MSIL,就像C#和VB 。净。你可以在VB和C++/CLI中编写一些简单的测试函数来自己看看。

+0

在这一点上,这是各自编译器的问题。 C++团队可能倾向于比C#或VB.NET团队更努力地工作。 – 2009-12-09 15:56:13

+0

的确如此,但我认为C++/CLI团队是所有团队中最小的。他们在VS 2010中甚至没有用于C++/CLI的Intellisense。所以我不认为该团队正在努力将C++优化为MSIL编译,或者至少比C#或VB团队更重要。 – Eric 2009-12-09 17:46:21

+0

说这没什么好处是不对的。它们可能不适用于所有设计,但在某些情况下,它们具有非常显着的优势。 – 2012-11-19 04:30:47

3

我是一个表现欲太强了,我已经了解到,

  1. 这类问题不是我甚至问,直到我知道那里的性能问题,

  2. 一旦我知道它们在哪里,我不需要问,因为我可以很容易地发现,因为a)所有编译的语言生成汇编或中间语言,我可以看看,和b)我可以运行它10^6次只是时钟而已。

我的经验是有多个性能问题,有一系列的尺寸。首先,我修复那些最容易/最大的。这使得其余的人占用更大的时间百分比,所以他们更容易找到下一步。**

I keep doing tuning passes until I run out of performance problems I can fix. 到那时代码可以比开始的方式更快。

**示例:假设程序需要10秒钟。假设有两个问题(你直到你看不到),他们分别占50%和30%。你修好第一个,时间下降到5秒。现在第二个问题是消耗60%,因为总时间减少了,所以更容易发现。修复它,时间下降到2秒 - 5倍加速。存在的问题越多,可能的加速越戏剧化。人们可能会怀疑他们有这么大的问题,如果是的话,抽样会证明或反驳它。

+0

谢谢,迈克。但是,这与我的问题无关。 – 2009-12-08 03:34:10

+0

Upvoted提供一个有效的点。 – 2014-08-22 11:29:08

3

C++/CLI被管理 - 它被编译成与其他.net语言相同的MSIL。如果速度对你来说是最重要的,那么在本地dll中写入关键位并从你的vb.net应用程序中扣除它(保持thunk count不变,你应该没问题)。

虽然tbh,id首先检查代码是否真的有必要,而不仅仅是过早的优化。无论如何,MSIL可以被编译成本地代码 - 真正的问题是.net JITer是否像原生c/C++编译器一样优化。

0

虽然C++/CLI编译器可能无法为代码的直接转换提供更好的性能,但有许多C++功能甚至可以在托管代码中提供巨大的性能优势。

一个很大的模板。该代码被重新生成并针对每个模板参数组合进行独立优化。尽管.NET泛型通常会抑制最微不足道的内联,但转换为C++/CLI模板可以提供额外的优化机会,以及在任何其他.NET语言中都没有任何等价物的专业化和编译时元程序。

0

性能增益来自将非托管代码与托管程序集混合使用。 C++/cli使这非常简单。尝试通过c#或vb.net调用C++ pinvoke ...你必须将C++包装在extern c调用中,或者通过调用C++来调用C++。此外,您还可以从优化的Microsoft C++编译器中获得相当不错的性能收益。如果你不混合非托管代码,那么就没有性能增益,因为它像其他人提到的那样编译为MSIL。