Новый объект против сдержанной печати с помощью ярлыка - PullRequest
0 голосов
/ 03 ноября 2018

Я рефакторинг некоторого старого (ish) кода, и я использовал два подхода для создания некоторых массивов и упорядоченных словарей, например ...

[Collections.Specialized.OrderedDictionary]@{}

и

New-Object Collections.Specialized.OrderedDictionary

Интересно, какой из этих двух подходов к созданию экземпляров массивов и хеш-таблиц / словарей лучше? FWIW, мне нужен код, который не зависит от версии от PS2.0 через текущий. Производительность - это вторичная проблема.

FWIW, похоже, что первое намного лучше с точки зрения производительности. Я пытался

Measure-Command {
    foreach ($i in 1..10000) {
        $array1 = [Collections.Specialized.OrderedDictionary]@{}
    }
}
Measure-Command {
    foreach ($i in 1..10000) {
        $array2 = New-Object Collections.Specialized.OrderedDictionary
    }
}

и получил 34 миллисекунды против 278 миллисекунд. Конечно, я не создаю 10K экземпляров, и при этом производительность не является основным приоритетом, а не является низкой производительностью в 278 миллисекунд, даже если это был приоритет. Но это, безусловно, показывает, что в процессе есть большая разница, даже если конечный результат на самом деле тот же.

1 Ответ

0 голосов
/ 03 ноября 2018

Когда я делаю следующее:

cls

write-host "array1:"
$array1 = [System.Collections.Specialized.OrderedDictionary]@{}
$array1.GetType()
(Measure-Command -Expression {1..10000 | ForEach-Object { $array1.Add($_,"") }}).Milliseconds

write-host
write-host

write-host "array2:"
$array2 = New-Object System.Collections.Specialized.OrderedDictionary
$array2.GetType()
(Measure-Command -Expression {1..10000 | ForEach-Object { $array2.Add($_,"") }}).Milliseconds

Я получаю, например, следующее, то есть я думаю, что они относятся к одному типу, поэтому я не ожидаю никакой разницы, производительности или иного:

array1:

IsPublic IsSerial Name              BaseType     
-------- -------- ----              --------     
True     True     OrderedDictionary System.Object
492


array2:

IsPublic IsSerial Name              BaseType     
-------- -------- ----              --------     
True     True     OrderedDictionary System.Object
500        

Кстати, начиная с PS 3.0, $array3=[ordered]@{} дает вам тот же тип +++:

array3

IsPublic IsSerial Name              BaseType     
-------- -------- ----              --------     
True     True     OrderedDictionary System.Object                                                                                                 

+++ О хеш-таблицах

Начиная с PowerShell 3.0, вы можете использовать [заказанный] атрибут для создать упорядоченный словарь (System.Collections.Specialized.OrderedDictionary) в PowerShell.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...