總結散列表的所有值的更快方法是什麼?總結散列表的所有值的更快方法
$a = @{}
$a.Add("Test1",1)
$a.Add("Test2",2)
$a.Add("Test3",3)
預期結果:6
類似的東西,但它不工作:
$a.GetEnumerator() | %{($_.Value | Measure-Object -Sum).Sum}
我去,所以我需要更快的創造超過10 000個條目的哈希表辦法。
感謝
總結散列表的所有值的更快方法是什麼?總結散列表的所有值的更快方法
$a = @{}
$a.Add("Test1",1)
$a.Add("Test2",2)
$a.Add("Test3",3)
預期結果:6
類似的東西,但它不工作:
$a.GetEnumerator() | %{($_.Value | Measure-Object -Sum).Sum}
我去,所以我需要更快的創造超過10 000個條目的哈希表辦法。
感謝
Measure-Object
被大約是枚舉和增加值的兩倍。
證明:
PS C:\>$a = @{}
PS C:\>for ($i=1; $i -lt 50000; $i++) { $a["$i"] = (Get-Random) % 5 }
PS C:\>1..5 | % {
>> Measure-Command {
>> $total = 0
>> $a.GetEnumerator() | % { $total += $_.value }
>> } | select -Expand TotalMilliseconds
>>}
>>
1075,2542
1081,5379
1082,1324
1074,9834
1076,5663
PS C:\>1..5 | % {
>> Measure-Command {
>> ($a.Values | Measure-Object -Sum).Sum
>> } | select -Expand TotalMilliseconds
>>}
>>
577,9536
565,8076
579,8534
572,4747
568,8108
將這樣的事情會更快,因爲你不應該需要使用GetEnumerator()
($a.Values | Measure-Object -Sum).Sum
如果不是這樣,我想你可以結合兩者的答案在這裏
(measure-command {
$Sum = 0
$a = @{}
$sum += ($a.Test = 1)
$sum += ($a.Test2 = 2)
$sum += ($a.Test3 = 3)
}).TotalMilliseconds
(Measure-Command {
$a = @{}
$a.Add("Test1",1)
$a.Add("Test2",2)
$a.Add("Test3",3)
}).TotalMilliseconds
0.2585
0.4121
第一種方法是更快,你會得到插播積累$總和。