关于c#:泛型与数组列表

关于c#:泛型与数组列表

Generics vs. Array Lists

我在这里工作的系统是在.net 2.0之前编写的,没有使用泛型的好处。 最终将其更新为2.0,但是由于时间限制,没有重构任何代码。 在许多地方,代码使用ArraysLists等将事物存储为对象。

从性能的角度来看,将代码更改为使用泛型有多重要? 我从性能角度,装箱和拆箱等方面知道,它效率低下,但是通过更改它确实可以带来多少性能提升? 泛型是否可以继续使用,还是需要进行足够的性能更改以至于需要良心来更新旧代码?


正如您所说,从技术上讲,泛型的性能更好。但是,除非性能非常重要并且您已经在其他领域进行了优化,否则您可能会花时间在其他地方来获得更好的改进。

我会建议:

  • 继续使用泛型。
  • 如果您有可靠的单元测试,则在触摸代码时重构为泛型
  • 花其他时间进行重构/测量将显着提高性能(数据库调用,更改数据结构等),而不是在这里和那里花费几毫秒的时间。

当然,除了性能之外,还有其他原因可以更改为泛型:

  • 更少的错误倾向,因为您可以在类型时进行编译时检查
  • 更具可读性,您无需在所有地方都进行转换,并且很明显存储在集合中的是哪种类型
  • 如果您日后使用泛型,那么在任何地方使用它们都会更清洁

这是我从100KB文件的字符串中简单解析100,000次后得到的结果。通用列表(char)花费了612.293秒才能遍历该文件100,000次。
ArrayList花费了2,880.415秒来遍历该文件100,000次。这意味着在这种情况下(由于您的里程会有所不同),通用列表(字符)快了4.7倍。

这是我运行了100,000次的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Public Sub Run(ByVal strToProcess As String) Implements IPerfStub.Run
    Dim genList As New ArrayList

    For Each ch As Char In strToProcess.ToCharArray
        genList.Add(ch)
    Next

    Dim dummy As New System.Text.StringBuilder()
    For i As Integer = 0 To genList.Count - 1
        dummy.Append(genList(i))
    Next

End Sub

 Public Sub Run(ByVal strToProcess As String) Implements IPerfStub.Run
     Dim genList As New List(Of Char)

     For Each ch As Char In strToProcess.ToCharArray
         genList.Add(ch)
     Next

     Dim dummy As New System.Text.StringBuilder()
     For i As Integer = 0 To genList.Count - 1
         dummy.Append(genList(i))
     Next
 End Sub

唯一可以确定的方法是使用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-方法。

    不过,最主要的是,由于您能从泛型中获得强大的输入,泛型更易于阅读,并且在整个应用程序中也更加稳定。您不仅会从性能中受益,而且会从代码的可维护性和稳定性中受益。如果您可以快速完成,我会说的。

    如果您可以从产品负责人那里买进,我建议您清理一下。您之后会更喜欢您的代码。


    我的老公司实际上考虑了这个问题。我们采取的方法是:如果容易重构,请执行;如果不是这样(即会涉及过多的课程),请稍候片刻。这实际上取决于您是否有时间进行编码,或者是否还有其他重要项目要编码(即您应该为客户端实现的功能)。

    再说一次,如果您没有为客户做某事,那就继续并花一些时间进行重构。它将为您自己提高代码的可读性。


    自动装箱/拆箱与泛型有什么关系?这只是类型安全问题。对于非泛型集合,您需要显式地转换回对象的实际类型。使用泛型,您可以跳过此步骤。我认为一种或另一种方式没有性能差异。


    您将在维护阶段获得最大的收益。泛型更易于处理和更新,而不必处理转换和转换问题。如果这是您不断访问的代码,则一定要努力。如果这是多年未触及的代码,我就不会打扰。


    推荐阅读

      提高3A四核羿龙II游戏配置的性能

      提高3A四核羿龙II游戏配置的性能,,以节能环保为主题的IT产业,目前3A低端平台处理器、主板芯片组、独立开发卡性能突出,特别是在与AMD的处理

      优化PostgreSQL中的批量更新性能

      优化PostgreSQL中的批量更新性能,数据,表格,在Ubuntu 12.04上使用PG 9.1. 我们目前需要24小时才能运行大量UPDATE数据库上的语句,其形式

      诺基亚威图性能好到哪里

      诺基亚威图性能好到哪里,诺基亚,手机,诺基亚威图性能好到哪里这是一部以前列出的手机。即使当时配置不高,该品牌的手机也不依赖于该功能吸

      魅蓝note6性能参数有哪些

      魅蓝note6性能参数有哪些,摄像头,蓝牙,魅蓝note6性能参数有哪些魅力蓝色Note6最好拍照。电池寿命更长。蓝色Note6使用高通 snapdragon 625

      国产电脑cpu测试|国产CPU性能

      国产电脑cpu测试|国产CPU性能,,国产CPU性能天玑9000答: 天玑9000更厉害。因为天玑9000是 最新发布的cpu,也是现在的天花板。而麒麟9000是 2

      主流电脑cpu性能分析|cpu性能对比表

      主流电脑cpu性能分析|cpu性能对比表,,1. cpu性能对比表一、参数对比1、r7 5800H:制程工艺为7nm,主频3.2GHz,睿频4.4GHz,线程数是8核16线程,45W

      新老酷睿i3性能对比试验i34130和i33220

      新老酷睿i3性能对比试验i34130和i33220,,新的英特尔酷睿i3-4130 Haswell处理器架构已经推出了很长一段时间,虽然市场的时间还不长,已经成为

      电脑显卡240|电脑显卡性能排行

      电脑显卡240|电脑显卡性能排行,,电脑显卡性能排行1、RTX 3090:这款显卡被称为地球最强,强的一塌糊涂,不论什么样的游戏都能完美的驾驭。2、Ti