我很久以前开始使用普通的C语言,然后转到C++,现在我面对的是C++/CLI。作为一个性能怪胎,我总是试图将最后一滴性能挤到每一行代码中。我目前在一个项目中,主要使用VB.Net (简单性,资源可用性等)完成,但有几点对性能非常敏感,我计划用C++/CLI语言完成这些部分。然而,它只有一小部分可以从托管代码中取出,而其余的则需要保持托管。问题是,与C#或VB.Net相比,通过编写C++/CLI托管函数可以获得预期的性能提升吗?从我读过的文档中我可以理解,唯一的优势似乎是托管/非托管thunking更轻。真的是这样吗?因为我甚至不能将句柄存储在非托管数组或结构中(我可以更快地操作它们),例如:
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)发布于 2009-12-07 18:43:57
在使用C++/CLI时,您可能看到的唯一性能提升是将本机代码和托管代码混合在一起。C++/CLI允许您以比VB.Net更少的开销为代码的性能关键部分调用本机方法。我不建议到处在本机和托管之间切换,因为这仍然是有惩罚的,但将控制传递给与性能相关的代码块的本机代码是可以接受的。
发布于 2009-12-07 22:06:47
我也是个表演狂人,我学到了
我的经验是有多个性能问题,具有不同的大小。首先,我修复最简单/最大的那些。这使得其余的人花费了更多的时间,所以在下一次传递时更容易找到他们。**
I keep doing tuning passes until I run out of performance problems I can fix.到那时,代码可以比开始时快得多。
**示例:假设程序运行时间为10秒。假设有两个问题(直到你看了才知道),它们分别占50%和30%。你修复了第一个,时间降到了5秒。现在第二个问题消耗了60%,因为总时间减少了,所以更容易发现。解决它,时间下降到2秒-5倍的速度。问题越多,可能的加速效果就越显著。人们可能会怀疑他们有这么大的问题,如果是这样,抽样将证明或反驳这一点。
发布于 2009-12-07 22:18:29
C++/CLI是托管的-它被编译成与其他所有.net语言相同的MSIL。如果速度对你来说是王道,在原生动态链接库中编写临界位,并从你的vb.net应用程序中调用它(保持thunk的倒计时,你就应该很好)。
虽然tbh,id首先分析代码,看看这是否真的是必要的,而不仅仅是过早的优化。无论如何,MSIL都可以编译成本机代码--真正的问题是.net JITer是否和本机c/c++编译器一样优化。
https://stackoverflow.com/questions/1859123
复制相似问题