【问题标题】:Resizing array performance?调整阵列性能?
【发布时间】:2012-03-25 11:56:31
【问题描述】:

我想知道不断调整字节数组的大小是否会对性能产生重大影响。我正在向一个类添加数据,如果该类已经包含该数据类型,我需要将其添加到现有字节数组中,这意味着我需要调整它的大小。问题是我有一些数据类型会批量添加,这意味着可能会发生多个数组大小调整。

这会对性能产生巨大影响吗?这个类可能对性能非常关键。

如果是这样,那么我可能需要进行设计大修。

【问题讨论】:

  • 您应该通过使用探查器查看相对于代码的其他部分执行它是否占用了大量时间。 VS 有一个内置的,有一些免费的,或者付费的,比如 ANTS 或 dotTrace。
  • 构建它,分析它,如果它太慢,重构它。您认为对性能最关键的地方很可能实际上并不是对性能最关键的地方:)
  • @JayOtterbein 实际上我从来没有费心去搞过分析器,不过,这对我来说可能是个好主意。
  • @Alex,如果您没有使用分析器或以其他方式测量代码的性能,则不应声称代码对性能至关重要。如答案中所述,您应该使用 List 而不是 Array,但出于可读性/正确性原因,而不是性能原因。 List 已经编写/测试支持调整大小,这与使用 Array 的手工代码不同(不管你有多好)。
  • 如果您想知道某行代码是否会对性能产生不利影响,请设定一个客户可以接受的目标,测量代码的性能,看看是否它击败了目标。如果是这样,太好了,你就完成了。如果没有,那就去找一个分析器,找到最慢的东西,然后修复它。在互联网上询问既不了解您的代码,也不了解您的客户的陌生人会占用您编写性能测试的时间。

标签: c# .net arrays performance resize


【解决方案1】:

如果需要调整大小,那么您应该改用List<byte>。数组无法调整大小,因此您必须创建一个全新的数组,然后将旧内容复制到新数组中,然后再添加其他内容(如果您指的是Array.Resize,这就是这样做的)。

List<T> 在内部使用数组,但会优化调整大小,因此您不必处理它。

基本上,一旦内部数组已满并添加了新内容,List<T> 将使内部数组大小加倍,因此调整大小实际上应该很少发生 - 另一方面,如果您直接调整数组大小,您将不得不采用类似的策略并保留“大小计数器”或在任何内容添加时计算调整大小的性能成本。

【讨论】:

    【解决方案2】:

    是的,它会影响性能。调整数组大小并不是简单地使原始数组变长或变短,它会创建一个新数组并在必要时将数据从旧数组复制到新数组。

    正如评论中所建议的,使用动态容器,例如List或ArrayList,而后者不是类型保存但使用方便,我更喜欢。你可以看看:http://msdn.microsoft.com/en-us/library/system.collections.arraylist.aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-07
      • 1970-01-01
      • 1970-01-01
      • 2010-12-12
      • 1970-01-01
      • 1970-01-01
      • 2019-11-24
      • 2011-01-05
      相关资源
      最近更新 更多