Można powtórzyć tablic, po prostu jak możesz zrobić z ciągami:
$myArray = ,2 * $length
Oznacza to: »Weź tablicę z pojedynczym elementem 2
i powtórz ją raz za razem, $length
, uzyskując nową tablicę.«.
Należy pamiętać, że tak naprawdę nie można wykorzystać do tworzenia wielowymiarowych tablic, ponieważ następujący:
$some2darray = ,(,2 * 1000) * 1000
po prostu stworzyć 1000 odniesień do wewnętrznej tablicy, czyniąc je bezużytecznymi dla manipulacji. W takim przypadku możesz użyć strategii hybrydowej. Użyłem
$some2darray = 1..1000 | ForEach-Object { ,(,2 * 1000) }
w przeszłości, ale pomiary wydajności poniżej sugerują, że
$some2darray = foreach ($i in 1..1000) { ,(,2 * 1000) }
byłby znacznie szybszy sposób.
Niektóre pomiary skuteczności:
Zrobione przez uruchomienie każdego wariantu 50 razy przez
Measure-Command
, każdy o tej samej wartości dla
$length
oraz uśrednienie wyników
Command Average Time (ms)
------- -----------------
$a = ,2 * $length 0,135902 # my own
[int[]]$a = [System.Linq.Enumerable]::Repeat(2, $length) 7,15362 # JPBlanc
$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 # Ansgar
$a = 1..$length | %{ 2 } 431,70304 # JPBlanc
$a = @(); for ($i = 0; $i -lt $length; $i++) { $a += 2 } 10425,79214 # original code
.
Pozycja 3 i 4 to w istocie zaskoczenie. Wygląda na to, że o wiele lepiej jest uzyskać wartość foreach
niż zakres, zamiast używać normalnej pętli for
.
kod, aby wygenerować wykres powyżej:
$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
+1 i akceptowane. '$ myArray =, 2 * 16385' działa w 0,01 s. – nixda
+1 To niezły bieg! – JPBlanc
+1 Zwięzłe, jasne, konstruktywne, wszechstronne i powtarzalne! (no, 4 na 5 c ...) –