PowerShell v2中,我们使用下面的方法创建自定义对象:
$CustomObject1 = New-Object psobject -Property @{a=1; b=2; c=3; d=4} $CustomObject1 | Format-List
PowerShell v3中,我们可以使用[pscustomobject]来创建自定义对象:
$CustomObject2 = [pscustomobject]@{a=1; b=2; c=3 $CustomObject2 | Format-List
两中方法创建的都是具有NoteProperties属性的PSCustomObject对象,而不是hashtable对象:
$CustomObject1 | Get-Member $CustomObject2 | Get-Member
那么,为什么我们要使用PSCustomObject呢?
首先,他使用你赋予的属性顺序,不作修改.
当然,更主要的理由是PSCustomObject更快!
有4中方法来创建自定义对象,我们来看看速度上的差异:
1) Select-Object
$TestSelect = { (0..5000) | ForEach-Object {$CustomObject = "" | Select-Object Name,ID $CustomObject.Name = "Test Name" $CustomObject.ID = $_ $CustomObject } } Measure-Command $TestSelect | Format-Table TotalSeconds -Autosize
2) Add-Member
$TestAddMember = { (0..5000) | ForEach-Object {$CustomObject = New-Object psobject $CustomObject | Add-Member -Name "Name" -Value "Test Name" $CustomObject | Add-Member -Name "ID" -Value $_ $CustomObject } } Measure-Command $TestAddMember | Format-Table TotalSeconds -Autosize
3) Property Parameter
$TestProperty = { (0..5000) | ForEach-Object {New-Object psobject -Property @{Name = "Test Name"; ID = $_}} } Measure-Command $TestProperty | Format-Table TotalSeconds -Autosize
4) [pscustomobject]
$TestProperty = { (0..5000) | ForEach-Object {[pscustomobject]@{Name = "Test Name"; ID = $_}} } Measure-Command $TestPSCustomObject | Format-Table TotalSeconds -Autosize
我们来总结下:
Select-Object = 7.74s
Add-Member = 28.87s
Property = 7.29
[pscustomobject] = 0.94s
原文连接:
powershell-v3-creating-objects-with-pscustomobject-its-fast
本文链接: https://www.pstips.net/creating-objects-with-pscustomobject-its-fast.html
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!
翻译整理了半天,才发现已经有了一篇类似的文章了 http://www.pstips.net/performance-of-custom-psobject.html坑爹啊
没事,这样更可以加深印象哈。
呵呵,老大,我有个问题,为什么第一张图的输出顺序是cdba? 不是abcd?dcba?或者是随机的?
这个是因为你用的是无序哈希表,用有序哈希表即可。参考这篇文章《PowerShell有序哈希表和更改顺序》:http://www.pstips.net/ordered-hash-tables-and-changing-order.html
hi, 我看了这个帖子,但还是没能消除我的疑惑啊,我输入abcdefg,书来的居然是afbced,完全找不到规律啊~~
不可能吧,能给个重现的例子吗?
New-Object psobject -Property @{a=1; b=2; c=3; d=4; e=5; f=6}输出:a : 1f : 6b : 2c : 3e : 5d : 4
你换个方法:[psobject][Ordered]@{a=1; b=2; c=3; d=4; e=5; f=6}
这个办法我知道,我就是奇怪为什么第一种这种输出方淑为什么按照这样的顺序输出?看上去随机似乎又不是,奇怪就奇怪在这里…
默认的哈希表本身就没有顺序,要保证通过键值访问的效率,键的存储不可能是顺序存储的,是按照哈希算法的。
路过帮顶
原来还有这么厉害的集合。学习了