Generics vs. Array Lists我在这里工作的系统是在.net 2.0之前编写的,没有使用泛型的好处。 最终将其更新为2.0,但是由于时间限制,没有重构任何代码。 在许多地方,代码使用ArraysLists等将事物存储为对象。 从性能的角度来看,将代码更改为使用泛型有多重要? 我从性能角度,装箱和拆箱等方面知道,它效率低下,但是通过更改它确实可以带来多少性能提升? 泛型是否可以继续使用,还是需要进行足够的性能更改以至于需要良心来更新旧代码? 正如您所说,从技术上讲,泛型的性能更好。但是,除非性能非常重要并且您已经在其他领域进行了优化,否则您可能会花时间在其他地方来获得更好的改进。 我会建议:
当然,除了性能之外,还有其他原因可以更改为泛型:
这是我从100KB文件的字符串中简单解析100,000次后得到的结果。通用列表(char)花费了612.293秒才能遍历该文件100,000次。 这是我运行了100,000次的代码:
唯一可以确定的方法是使用dotTrace之类的工具来分析代码。 http://www.jetbrains.com/profiler/ 装箱/拆箱在您特定的应用程序中可能是微不足道的,因此不值得重构。展望未来,由于编译时类型的安全性,您仍应考虑使用泛型。 无论是Java还是.NET,泛型都应用于设计和类型安全,而不是性能。自动装箱与泛型(本质上是隐式的对象到原始的转换)不同,并且如前所述,如果要进行大量的算术运算或其他操作会导致性能下降,则不应使用它们代替原始。隐式对象的创建/销毁。 总的来说,我建议您继续使用,并且仅在需要出于类型安全/设计目的而不是性能而对其进行清理的情况下才更新现有代码。 这取决于,最好的答案是分析您的代码并查看。我喜欢AQTime,但是为此有很多软件包。 通常,如果正在使用ArrayList,则可能需要将其切换为通用版本。确实,您很可能甚至无法衡量性能差异。装箱和拆箱是额外的步骤,但是现代计算机是如此之快,几乎没有什么区别。由于ArrayList实际上只是一个具有良好包装器的普通数组,因此与转换为泛型相比,您可能会发现,通过更好的数据结构选择(ArrayList.Remove为O(n)!)可以获得更高的性能。 编辑:Outlaw程序员有一个好点,您仍将使用泛型进行装箱和拆箱,它只是隐式发生。但是,所有有关检查类型转换和" is / as"关键字的异常和空值的代码都会有所帮助。 如果您想在更高版本的C#版本中使用linq之类的东西,那么使用泛型还应该意味着您的代码将更加简单易用。 泛型具有更好的性能,尤其是当您使用值类型(int,bool,struct等)时,您将获得明显的性能提升。 将Arraylist与值类型一起使用会导致装箱/拆箱,如果执行数百次,则装箱/拆箱会比使用常规List慢得多。 当将值类型存储为对象时,每个项目最多可存储四个时间。虽然这个数量不会耗尽您的RAM,但是较小的缓存可能包含较少的项目,这意味着在迭代较长的集合时,从主内存到缓存的副本会很多,这会使您的应用程序变慢。 我在这里写过。 如果ArrayLists中的实体是Object类型,则不将其强制转换为正确的类型会有所帮助。如果它们是值类型(如Int32之类的结构或原语),那么装箱/拆箱过程会增加很多开销,而通用集合应该更快。 这是有关该主题的MSDN文章 取决于代码中有多少。如果在UI中绑定或显示大列表,则可能会获得很大的性能提升。 如果您的ArrayList只是四处散布,那么清理它可能没什么大不了的,但是也不会对整体性能产生很大的影响。 如果您在整个代码中使用了大量ArrayList,并且替换它们(这可能会影响您的日程安排)会很麻烦,那么您可以采用if-you-touch-it-change-it-方法。 不过,最主要的是,由于您能从泛型中获得强大的输入,泛型更易于阅读,并且在整个应用程序中也更加稳定。您不仅会从性能中受益,而且会从代码的可维护性和稳定性中受益。如果您可以快速完成,我会说的。 如果您可以从产品负责人那里买进,我建议您清理一下。您之后会更喜欢您的代码。 我的老公司实际上考虑了这个问题。我们采取的方法是:如果容易重构,请执行;如果不是这样(即会涉及过多的课程),请稍候片刻。这实际上取决于您是否有时间进行编码,或者是否还有其他重要项目要编码(即您应该为客户端实现的功能)。 再说一次,如果您没有为客户做某事,那就继续并花一些时间进行重构。它将为您自己提高代码的可读性。 自动装箱/拆箱与泛型有什么关系?这只是类型安全问题。对于非泛型集合,您需要显式地转换回对象的实际类型。使用泛型,您可以跳过此步骤。我认为一种或另一种方式没有性能差异。 您将在维护阶段获得最大的收益。泛型更易于处理和更新,而不必处理转换和转换问题。如果这是您不断访问的代码,则一定要努力。如果这是多年未触及的代码,我就不会打扰。 |