【问题标题】:For PowerShell ArrayList, which is Faster .Add or += Operator?对于 PowerShell ArrayList,哪个是 Faster .Add 或 += 运算符?
【发布时间】:2019-06-10 01:11:39
【问题描述】:

我发现如果你在 PowerShell 中创建一个数组并这样做:

$myArray = @()
$myArray += 7

每次执行此语句时,它都会创建一个以 7 结尾的新数组,并返回新数组并删除旧数组!基本上,我们在大约 10,000 次迭代的循环中执行此操作,这非常慢!

如果我改用 ArrayList,通过调用 .Add(x),我们发现它要快得多。我的问题是哪个代码更快?

$myArrayList.Add(x)

$myArrayList += x

或者它们是一样的吗?因为我们现有的代码是+= x 格式。我们希望不必将所有代码更改为.Add(x) 格式。

【问题讨论】:

  • 请注意,当您对其执行+= 时,您的ArrayList 将转换为数组。
  • 除非您将其定义为[Collections.ArrayList]$myArray = @()(好吧,在那种情况下它可能会被转换两次,首先是Array,然后又是ArrayList)。
  • @MattBrowne 推荐了这个有关 PowerShell 性能的相关演示文稿,其中:youtu.be/Yp_m5T_kyJU?t=1227(直接链接到相关部分,但整个演示文稿很有趣)。

标签: arrays powershell arraylist


【解决方案1】:

使用以下命令得到这些结果,10,000 次迭代。

.add() 取了0s 45.2869ms

+= 取了2s 900.2777 ms

Measure-Command -Expression {
    $i = 0
    $myArrayList = New-Object System.Collections.ArrayList
    Do {
        #$myArrayList.add($i)
        $myArrayList += $i
        $i++
    } While ($i -lt 10000)
}

【讨论】:

    【解决方案2】:

    Drew's answer 很好地表明 += 在 PowerShell 中使用数组时性能不佳;您已经在问题中找到了原因(每次都会创建一个新数组,复制所有元素等)。

    请注意,ArrayList 不是您唯一的选择。有时仅仅改变你做事的方式就会有很大的不同;例如循环和迭代在 PowerShell 中很常见,通过赋值生成输出数组非常快,而且我认为语法也更好。

    比较一下(2s 406ms):

    Measure-Command -Expression {
        $a = @()
        1..10000 | % { $a += $_*2 }
    }
    

    对此(60ms):

    Measure-Command -Expression {
        $a = 1..10000 | % { $_*2 }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-01
      • 2012-07-30
      • 2021-01-02
      • 2020-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-31
      相关资源
      最近更新 更多