混合模式的.NET程序集是否具有更好的性能?

3

我对.Net编程非常新,大约1年左右。

几天前,我查阅了一些与混合模式程序集相关的文章,出于好奇,我很难理解其中的很多内容。

  1. 如果在C#/VB.NET中可以轻松进行P / Invoke,为什么Microsoft会引入混合模式程序集?

  2. 混合模式程序集是否比纯.Net程序集执行更快?

由于.Net是CLR(类似于VM),因此我最好的猜测是,在混合模式下编译的程序集也将在CLR中,这最终会降低性能。

请帮助我解决困惑!


从通常意义上讲,MM(内存管理)组件的性能应该较差,因为灵活性和资源使用之间总是存在一种权衡。 - sll
是的,我现在也认为一样,但我猜在某些情况下MM汇编肯定非常有用。 - Parimal Raj
1
从http://msdn.microsoft.com/en-us/library/x0w2664k.aspx看来,混合模式程序集的引入是为了实现将本地C++项目平滑迁移到.NET。 - M.A. Hanin
所以,混合模式程序集并不会执行得更快? - Parimal Raj
在我看来,托管部分的执行效果就像非混合程序集一样;而非托管部分的执行效果基本上就像完全非托管的 DLL 一样,可能会有一些开销。但我承认我不是专家。 - digEmAll
显示剩余2条评论
1个回答

6
混合模式程序集的主要用途是与现有的C或C ++代码进行交互。这当然非常常见。
它的设计并不会使代码更快。从托管代码转换到本机代码执行会产生一定的代价。如果你做得对,它会被高度优化,那么你只需要在堆栈上写一个cookie,垃圾收集器就会识别并避免查找未经管理的堆栈帧中的对象引用。成本只有少量的CPU周期。但是当你需要翻译数据时,可能会产生额外的成本。字符串是典型的例子。或者固定托管对象以防止其被垃圾收集器移动,数组是典型的例子。
但是,你确实可以使用混合模式程序集来解决性能问题。如果你可以限制转换的次数,并利用C或C ++编译器生成高度优化的代码的能力,那么你可能会领先。没有魔法公式可以保证你成功,而且要打败JIT编译器也绝非易事。虽然JIT编译器具有相当有效的优化器,但它无法完全击败C编译器的优化器,因为它是在时间约束下运行的。你编写的代码质量最为重要。
始终首先使用分析器来消除任何错误,找到实际的热点,并确保值得尝试。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接