È possibile ripetere gli array, basta come puoi fare con le stringhe:
$myArray = ,2 * $length
Ciò significa »Prendi l'array con il singolo elemento 2
e ripetilo $length
volte, ottenendo un nuovo array.«.
Si noti che non si può davvero utilizzare questo per creare array multidimensionali perché il seguente:
$some2darray = ,(,2 * 1000) * 1000
sarà solo creare 1000 riferimenti alla matrice interna, che li rende inutili per la manipolazione. In tal caso puoi usare una strategia ibrida. Ho usato
$some2darray = 1..1000 | ForEach-Object { ,(,2 * 1000) }
in passato, ma le misure di sotto delle prestazioni suggerire che
$some2darray = foreach ($i in 1..1000) { ,(,2 * 1000) }
sarebbe un modo molto più veloce.
Alcune misurazioni delle prestazioni:
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
Tratto eseguendo ogni variante 50 volte attraverso Measure-Command
, ciascuna con lo stesso valore per $length
, e la media dei risultati.
Le posizioni 3 e 4 sono in realtà una sorpresa. Apparentemente è molto meglio a foreach
su un intervallo invece di utilizzare un normale ciclo for
.
codice per generare sopra tabella:
$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 e accettato. '$ myArray =, 2 * 16385' viene eseguito in 0,01s – nixda
+1 è una bella corsa! – JPBlanc
+1 Conciso, chiaro, costruttivo, completo e riproducibile! (beh, 4 su 5 c ...) –