C#Generics有性能优势吗?

Rob*_*ini 37 .net c# generics performance

我有许多代表各种实体的数据类.

哪个更好:使用泛型和接口编写泛型类(比如打印或输出XML),或者编写一个单独的类来处理每个数据类?

是否有性能优势或任何其他好处(除了节省我编写单独课程的时间)?

Dan*_*mal 59

使用泛型具有显着的性能优势 - 您不需要装箱和拆箱.与开发自己的课程相比,它是一个抛硬币(硬币的一侧加权比另一侧重).如果您认为自己可以胜过框架的作者,那么只能自己动手.

  • 经验证据告诉我,使用泛型的假定性能优势在很大程度上是理论上的.然而,强类型输入是非常有说服力的论据,可以选择泛型而非泛型对应物. (10认同)

Jas*_*ort 20

不仅是,而且是肯定的.我不相信他们能做出多大的改变.在将一小部分使用ArrayLists和HashTables的核心代码重写为泛型之后,我们在VistaDB中进行了测试.速度提高250%或更多.

阅读我的博客,了解我们在泛型与弱类型集合上所做的测试.结果引起了我们的注意.

我已经开始重写大量使用弱类型集合的旧代码到强类型集合.ADO.NET界面最让人印象深刻的一点就是它们没有暴露出更强类型的数据输入和输出方式.从物体到背部的铸造时间是大批量应用中的绝对杀手.

强类型的另一个副作用是您经常会在代码中发现弱类型的引用问题.我们发现,通过在某些情况下实施结构以避免对GC施加压力,我们可以进一步加快代码速度.将此与强力打字相结合,以提高您的速度.

有时您必须在dot net运行时中使用弱类型接口.尽可能地寻找保持强类型的方法.它确实对非平凡应用程序的性能产生巨大影响.


And*_*ser 15

从CLR的角度来看,C#中的泛型是真正的泛型类型.泛型类的性能与完全相同的特定类之间应该没有任何根本区别.这与Java Generics不同,后者更像是需要的自动类型转换或在编译时扩展的C++模板.

这是一篇很好的论文,有点陈旧,它解释了基本设计: " . NET公共语言运行时泛型的设计和实现".

如果您手动编写特定任务的类,您可以通过泛型类型的接口优化某些方面,从而需要额外的弯路.

总之,可能会有性能优势,但我会首先推荐通用解决方案,然后根据需要进行优化.如果您希望使用许多不同类型实例化泛型,则尤其如此.


tor*_*ial 7

我针对不同的问题对ArrayList和通用列表进行了一些简单的基准测试:泛型与阵列列表,您的里程会有所不同,但是通用列表比ArrayList快4.7倍.

所以是的,如果您正在进行大量操作,装箱/拆箱是至关重要的.如果您正在做简单的CRUD,我不会担心它.


Hri*_*hev 6

泛型是参数化代码和避免重复的方法之一.看看你的程序描述和你编写一个单独的类来处理每个数据对象的想法,我会倾向于泛型.让一个单独的类处理许多数据对象,而不是许多做同样事情的类,可以提高您的性能.当然,以改变代码的能力衡量的性能通常比计算机性能更重要.:-)


Joh*_*dol 6

根据 Microsoft 的说法,泛型比转换(装箱/拆箱基元)更快,这是事实。 \n他们还声称泛型比引用类型之间的转换提供更好的性能,这似乎是不真实的(没有人能完全证明这一点)。

\n\n

Tony Northrup - MCTS 70-536:应用程序开发基础的合著者 - 在同一本书中指出以下内容:

\n\n
\n

我还没有\xe2\x80\x99 能够重现泛型的性能优势;\n 然而,根据 Microsoft 的说法,\n 泛型比使用\n 转换更快。在实践中,事实证明,强制类型转换比使用泛型快几倍。但是,您可能不会\xe2\x80\x99t\n 注意到应用程序中的性能差异。(我的测试超过 100,000\n 次迭代只花费了几秒钟。)\n 因此,您仍然应该使用泛型\n,因为它们是类型安全的。

\n
\n\n

与引用类型之间的转换相比,我无法用泛型重现这样的性能优势 - 所以我想说性能增益“应该”超过“显着”。

\n