如何最好地加快powershell处理时间(比较对象)

如何最好地加快powershell处理时间(比较对象),powershell,Powershell,我有一个powershell脚本,它使用Compare对象来区分/比较MD5校验和的列表。。。我怎样才能加快速度?它已经运行了几个小时了 $diffmd5 = (Compare-Object -ReferenceObject $localmd5 -DifferenceObject $remotefilehash | Where-Object { ($_.SideIndicator -eq '=>') } | Select-Object -ExpandProperty InputObj

我有一个powershell脚本,它使用Compare对象来区分/比较MD5校验和的列表。。。我怎样才能加快速度?它已经运行了几个小时了

$diffmd5 = 
(Compare-Object -ReferenceObject $localmd5 -DifferenceObject $remotefilehash |
 Where-Object { ($_.SideIndicator -eq '=>') } | 
Select-Object -ExpandProperty InputObject)

我觉得这应该比比较对象快


这里的问题是.contains方法是区分大小写的,我相信所有MD5哈希都有大写字母,但如果不是这种情况,则需要调用.toupper或.tolower方法来规范化数组。

我觉得这应该比Compare Object快

这里的问题是.contains方法是区分大小写的,我相信所有MD5哈希都有大写字母,但如果不是这样,则需要调用.toupper或.tolower方法来规范化数组。

很方便,但确实很慢;同时,完全避免管道对于最大化性能也很重要

我建议使用一个实例,它支持在一组无序值中进行高性能查找[1]:

# Two sample arrays
$localmd5 = 'foo1', 'bar1', 'baz1'
$remotefilehash = 'foo1', 'bar1', 'bar2', 'baz1', 'more'

# Create a hash set from the local hashes.
$localHashSet = [System.Collections.Generic.HashSet[string]] $localmd5

# Loop over all remote hashes to find those not among the local hashes.
$remotefilehash.Where({ -not $localHashSet.Contains($_) })
上面的结果是集合“bar2”,“more”

或者,如果输入集合a具有相同的大小,b具有相应的元素,即,应使用Compare Object with-SyncWindow 0(如中所示)将一个集合中的元素1与另一个集合中的元素1进行比较,以此类推,并进行后续的.SideIndicator筛选;为了加快操作,应使用-PassThru开关,该开关放弃在[pscustomobject]实例中包装不同的对象。SideIndicator属性随后作为NoteProperty成员直接添加到不同的对象中

[1] 默认情况下,查找区分大小写,但您可以将字符串相等比较器传递给构造函数,以选择不区分大小写的查找;例如。: [System.Collections.Generic.HashSet[string]]::新的[string[]]$localmd5[System.StringComparer]::OrdinalIgnoreCase很方便,但确实很慢;同时,完全避免管道对于最大化性能也很重要

我建议使用一个实例,它支持在一组无序值中进行高性能查找[1]:

# Two sample arrays
$localmd5 = 'foo1', 'bar1', 'baz1'
$remotefilehash = 'foo1', 'bar1', 'bar2', 'baz1', 'more'

# Create a hash set from the local hashes.
$localHashSet = [System.Collections.Generic.HashSet[string]] $localmd5

# Loop over all remote hashes to find those not among the local hashes.
$remotefilehash.Where({ -not $localHashSet.Contains($_) })
上面的结果是集合“bar2”,“more”

或者,如果输入集合a具有相同的大小,b具有相应的元素,即,应使用Compare Object with-SyncWindow 0(如中所示)将一个集合中的元素1与另一个集合中的元素1进行比较,以此类推,并进行后续的.SideIndicator筛选;为了加快操作,应使用-PassThru开关,该开关放弃在[pscustomobject]实例中包装不同的对象。SideIndicator属性随后作为NoteProperty成员直接添加到不同的对象中

[1] 默认情况下,查找区分大小写,但您可以将字符串相等比较器传递给构造函数,以选择不区分大小写的查找;例如。:
[System.Collections.Generic.HashSet[string]]::new[string[]]$localmd5[System.StringComparer]::OrdinalIgnoreCase

默认情况下,compare对象将第一个数组中的每个元素与第二个数组中的每个元素进行比较,最多比较20亿个位置,因此顺序无关紧要,但大型列表的速度会非常慢-syncwindow 0会快得多,但需要匹配项处于相同的精确位置:

Compare-Object $localmd5 $remotefilehash -syncwindow 0
作为-syncwindow的简单演示:

compare-object 1,2,3 1,3,2 -SyncWindow 0 # not equal

InputObject SideIndicator
----------- -------------
          3 =>
          2 <=
          2 =>
          3 <=


compare-object 1,2,3 1,3,2 -SyncWindow 1  # equal

compare-object 1,2,3 1,2,3 -SyncWindow 0  # equal

默认情况下,compare对象将第一个数组中的每个元素与第二个数组中的每个元素进行比较,最多比较大约20亿个位置,因此顺序无关紧要,但大型列表将非常缓慢-syncwindow 0会快得多,但需要匹配项处于相同的精确位置:

Compare-Object $localmd5 $remotefilehash -syncwindow 0
作为-syncwindow的简单演示:

compare-object 1,2,3 1,3,2 -SyncWindow 0 # not equal

InputObject SideIndicator
----------- -------------
          3 =>
          2 <=
          2 =>
          3 <=


compare-object 1,2,3 1,3,2 -SyncWindow 1  # equal

compare-object 1,2,3 1,2,3 -SyncWindow 0  # equal

有多少个被比较?大约50K个entries这是在寻找那些MD5哈希在$remotefilehash中而不是$localmd5正确吗?是的,这是正确的@Santiagosquarzon有多少个被比较?大约50K个entries这是在寻找那些MD5哈希在$remotefilehash中而不是$localmd5正确吗?是的,这是正确的@Santiagosquarzon如果不区分大小写很重要,您可以使用-contains运算符。@mklement0是的,我在考虑这个问题,但是您认为该运算符比使用方法和规范化更快吗?如果运算符更有效,那么-notin是最好的运算符,我认为,但根据我的经验,它与.containsys相比速度非常慢,-contains比.contains慢,但考虑到不区分大小写的比较所需的额外努力,这在一定程度上是不可避免的。直接比较应该是-ccontains,但它也比.Contains慢,所以对于区分大小写的比较,您是对的:.Contains更好。但是,由于无法将不区分大小写的比较器传递给.Contains,因此必须对要查找的集合和字符串进行大小写规范化,这通常比-Contains慢。请注意,还有-notcontains,就像-notin一样。@mklement0显然是带有[System]的哈希集
.StringComparer]::您的答案中的OrdinalIgnoreCase是最有效和最好的选择。我想是的,但知道这一点仍然很好。包含节拍-ccontains,尽管在许多情况下并不重要。如果大小写不敏感很重要,您可以使用-Contains运算符。@mklement0是的,我正在考虑这个问题,但是你认为操作符会比使用方法和规范化更快吗?如果运算符更有效,那么-notin是最好的运算符,我认为,但根据我的经验,它与.containsys相比速度非常慢,-contains比.contains慢,但考虑到不区分大小写的比较所需的额外努力,这在一定程度上是不可避免的。直接比较应该是-ccontains,但它也比.Contains慢,所以对于区分大小写的比较,您是对的:.Contains更好。但是,由于无法将不区分大小写的比较器传递给.Contains,因此必须对要查找的集合和字符串进行大小写规范化,这通常比-Contains慢。请注意,还有-notcontains,就像-notin一样。@mklement0显然是一个带有[System.StringComparer]的哈希集::OrdinalIgnoreCase在您的答案中是最有效和最好的选择。我想是的,但知道这一点仍然很好。包含beats-ccontains,尽管在许多情况下并不重要。如果我可以问一下,这就是所谓的方法重写吗?您要用新的不区分大小写的方法替换默认的contains方法吗?是否可以对新的泛型.list执行相同的操作?@SantiagoSquarzon:override指的是类声明,当派生类子类重新定义它将从其基类继承的方法时。重载是指具有给定名称的构造函数/方法的变体,其参数集不同。PowerShell在类型上公开的static::new方法只是公开该类型的构造函数的一种方式,以补偿PowerShell没有new关键字这一事实,尽管使用new Object cmdlet调用构造函数是一种替代方法。在本例中,正在调用构造函数重载。如果我可以问一下,这就是所谓的方法重写吗?您要用新的不区分大小写的方法替换默认的contains方法吗?是否可以对新的泛型.list执行相同的操作?@SantiagoSquarzon:override指的是类声明,当派生类子类重新定义它将从其基类继承的方法时。重载是指具有给定名称的构造函数/方法的变体,其参数集不同。PowerShell在类型上公开的static::new方法只是公开该类型的构造函数的一种方式,以补偿PowerShell没有new关键字这一事实,尽管使用new Object cmdlet调用构造函数是一种替代方法。在本例中,正在调用构造函数重载。