新对象与谨慎输入的捷径

时间:2018-11-03 16:58:39

标签: powershell

我正在重构一些旧的(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 :(得分:0)

当我执行以下操作时:

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                                                                                                 

+++ About Hash Tables

  

从PowerShell 3.0开始,您可以使用[ordered]属性来   创建有序词典   (System.Collections.Specialized.OrderedDictionary)在PowerShell中。