首页 / 知识
关于c#:泛型与数组列表
2023-04-17 06:56:00

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-方法。 不过,最主要的是,由于您能从泛型中获得强大的输入,泛型更易于阅读,并且在整个应用程序中也更加稳定。您不仅会从性能中受益,而且会从代码的可维护性和稳定性中受益。如果您可以快速完成,我会说的。 如果您可以从产品负责人那里买进,我建议您清理一下。您之后会更喜欢您的代码。 我的老公司实际上考虑了这个问题。我们采取的方法是:如果容易重构,请执行;如果不是这样(即会涉及过多的课程),请稍候片刻。这实际上取决于您是否有时间进行编码,或者是否还有其他重要项目要编码(即您应该为客户端实现的功能)。 再说一次,如果您没有为客户做某事,那就继续并花一些时间进行重构。它将为您自己提高代码的可读性。 自动装箱/拆箱与泛型有什么关系?这只是类型安全问题。对于非泛型集合,您需要显式地转换回对象的实际类型。使用泛型,您可以跳过此步骤。我认为一种或另一种方式没有性能差异。 您将在维护阶段获得最大的收益。泛型更易于处理和更新,而不必处理转换和转换问题。如果这是您不断访问的代码,则一定要努力。如果这是多年未触及的代码,我就不会打扰。 |
最新内容
相关内容
linux测试性能命令?
linux测试性能命令?,系统,网络,信息,工具,状态,地址,指标,情况,分析,下行,五个Linux简单命令帮你解决系统性能问题VMSTAT命令擅长用来查询CPUlinux性能检测命令?
linux性能检测命令?,系统,情况,信息,状态,工具,实时,百分比,指标,分析,命令,查看linux的cpu和内存要查看CPU使用情况,可以使用top命令。Top命令linux查看性能的命令?
linux查看性能的命令?,系统,情况,信息,数据,状态,指标,第一,分析,命令,宏观,linux查看cpu个数和核心数linux怎么查看cpu的个数?我们一起来了解linux磁盘列表命令?
linux磁盘列表命令?,情况,管理,系统,单位,信息,数据,命令,磁盘,服务,时间,linux的进入磁盘命令1、查看磁盘空间 -df df命令以磁盘分区为单位查linux命令筛选列表?
linux命令筛选列表?,工具,状态,位置,工作,预期,命令,名称,标准,数据,系统,在Linux下面的某一个文件的查找命令linux命令如果记不得,可以使用manlinux的长列表命令?
linux的长列表命令?,工作,系统,信息,命令,数据,目录,电脑,软件,时间,设备,Linux命令行大全的目录1、linux系统常用操作命令linux系统常用操作linux性能测试命令?
linux性能测试命令?,数据,系统,工具,标准,设备,地址,情况,基础,网络,环境,如何排除linux系统的读写缓存进行磁盘性能测试chkdsk。chkdsk的全称linux创建数组命令?
linux创建数组命令?,地址,工作,系统,信息,命令,代码,目录,情况,标准,文件,Linux命令linux系统常用操作命令如下:ls:全拼list,功能是列出目录的内linux目录列表命令?
linux目录列表命令?,系统,信息,标准,工作,命令,地址,时间,数据,名称,目录,linux查看目录下文件的命令linux系统下用ls命令列出当前目录下的文linux命令3d性能?
linux命令3d性能?,系统,工具,实时,百分比,信息,分析,软件,情况,网站,建设,Linux常用性能诊断命令详解1、第二行信息依次为:进程总数、运行中的linux性能管理命令?
linux性能管理命令?,工具,系统,信息,状态,网络,情况,工作,时间,短信,平均,linux性能监控工具有哪些1、开源网络监控工具:NetXMS NetXMS提供了企linux性能调参命令?
linux性能调参命令?,工具,工作,信息,网络,分析,系统,地址,实时,管理,状态,在linux中top命令的具体用法是什么?1、top命令用于显示系统运行的进