我有许多代表各种实体的数据类.
哪个更好:使用泛型和接口编写泛型类(比如打印或输出XML),或者编写一个单独的类来处理每个数据类?
是否有性能优势或任何其他好处(除了节省我编写单独课程的时间)?
使用泛型具有显着的性能优势 - 您不需要装箱和拆箱.与开发自己的课程相比,它是一个抛硬币(硬币的一侧加权比另一侧重).如果您认为自己可以胜过框架的作者,那么只能自己动手.
不仅是,而且是肯定的.我不相信他们能做出多大的改变.在将一小部分使用ArrayLists和HashTables的核心代码重写为泛型之后,我们在VistaDB中进行了测试.速度提高250%或更多.
阅读我的博客,了解我们在泛型与弱类型集合上所做的测试.结果引起了我们的注意.
我已经开始重写大量使用弱类型集合的旧代码到强类型集合.ADO.NET界面最让人印象深刻的一点就是它们没有暴露出更强类型的数据输入和输出方式.从物体到背部的铸造时间是大批量应用中的绝对杀手.
强类型的另一个副作用是您经常会在代码中发现弱类型的引用问题.我们发现,通过在某些情况下实施结构以避免对GC施加压力,我们可以进一步加快代码速度.将此与强力打字相结合,以提高您的速度.
有时您必须在dot net运行时中使用弱类型接口.尽可能地寻找保持强类型的方法.它确实对非平凡应用程序的性能产生巨大影响.
从CLR的角度来看,C#中的泛型是真正的泛型类型.泛型类的性能与完全相同的特定类之间应该没有任何根本区别.这与Java Generics不同,后者更像是需要的自动类型转换或在编译时扩展的C++模板.
这是一篇很好的论文,有点陈旧,它解释了基本设计: " . NET公共语言运行时泛型的设计和实现".
如果您手动编写特定任务的类,您可以通过泛型类型的接口优化某些方面,从而需要额外的弯路.
总之,可能会有性能优势,但我会首先推荐通用解决方案,然后根据需要进行优化.如果您希望使用许多不同类型实例化泛型,则尤其如此.
我针对不同的问题对ArrayList和通用列表进行了一些简单的基准测试:泛型与阵列列表,您的里程会有所不同,但是通用列表比ArrayList快4.7倍.
所以是的,如果您正在进行大量操作,装箱/拆箱是至关重要的.如果您正在做简单的CRUD,我不会担心它.
泛型是参数化代码和避免重复的方法之一.看看你的程序描述和你编写一个单独的类来处理每个数据对象的想法,我会倾向于泛型.让一个单独的类处理许多数据对象,而不是许多做同样事情的类,可以提高您的性能.当然,以改变代码的能力衡量的性能通常比计算机性能更重要.:-)