对于PowerShell ArrayList,这是更快的.Add或+ =运算符?

时间:2019-01-16 00:26:02

标签: arrays powershell arraylist

我发现,如果您在PowerShell中创建一个数组并执行以下操作:

$myArray = @()
$myArray += 7

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

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

$myArrayList.Add(x)

$myArrayList += x

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

2 个答案:

答案 0 :(得分:3)

使用以下命令(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)
}

答案 1 :(得分:3)

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

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

比较(2s 406ms):

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

对此(60ms):

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