您可以重复数组,就像您可以重复字符串一样:
$myArray = ,2 * $length
这意味着»获取只有一个元素2
的数组,并重复它$length
次,生成一个新数组。«。
请注意,您无法真正使用此方法创建多维数组,因为以下原因:
$some2darray = ,(,2 * 1000) * 1000
如果只是创建了1000个对内部数组的引用,这些引用对于操作来说就毫无用处。在这种情况下,您可以使用混合策略。我曾经使用过
$some2darray = 1..1000 | ForEach-Object { ,(,2 * 1000) }
过去,但下面的性能测量结果表明
$some2darray = foreach ($i in 1..1000) { ,(,2 * 1000) }
会是一个更快的方式。
一些性能测量:
Command Average Time (ms)
------- -----------------
$a = ,2 * $length 0,135902
[int[]]$a = [System.Linq.Enumerable]::Repeat(2, $length) 7,15362
$a = foreach ($i in 1..$length) { 2 } 14,54417
[int[]]$a = -split "2 " * $length 24,867394
$a = for ($i = 0; $i -lt $length; $i++) { 2 } 45,771122
$a = 1..$length | %{ 2 } 431,70304
$a = @(); for ($i = 0; $i -lt $length; $i++) { $a += 2 } 10425,79214
通过每个变量运行50次Measure-Command
,每个变量都使用相同的值$length
,并对结果取平均值。
实际上,位置3和4有点出乎意料。显然最好使用foreach
循环一个范围,而不是使用常规的for
循环。
生成上图的代码:
$length = 16384
$tests = '$a = ,2 * $length',
'[int[]]$a = [System.Linq.Enumerable]::Repeat(2, $length)',
'$a = for ($i = 0; $i -lt $length; $i++) { 2 }',
'$a = foreach ($i in 1..$length) { 2 }',
'$a = 1..$length | %{ 2 }',
'$a = @(); for ($i = 0; $i -lt $length; $i++) { $a += 2 }',
'[int[]]$a = -split "2 " * $length'
$tests | ForEach-Object {
$cmd = $_
$timings = 1..50 | ForEach-Object {
Remove-Variable i,a -ErrorAction Ignore
[GC]::Collect()
Measure-Command { Invoke-Expression $cmd }
}
[pscustomobject]@{
Command = $cmd
'Average Time (ms)' = ($timings | Measure-Object -Average TotalMilliseconds).Average
}
} | Sort-Object Ave* | Format-Table -AutoSize -Wrap