Performance Powershell合并2列出了性能

Performance Powershell合并2列出了性能,performance,list,powershell,join,Performance,List,Powershell,Join,我在Powershell中有两个包含大量数据的列表: $Byods,包含Mac和用户名,包含约5000项 $DHCPLeases包含Mac和IP,约3000件 我想创建一个新的列表,其中包含用户名和IP,其中Byods列表居首,IP从DHCPlies中找到,只包含找到匹配的记录(左连接?) 我创建了一个foreach循环,完成了这项工作。然而,它需要大量的时间来完成(>30分钟)。 我相信这会更快。有人吗 $UserByods = @() foreach ($lease in $DHCPLe

我在Powershell中有两个包含大量数据的列表:

  • $Byods,包含Mac和用户名,包含约5000项
  • $DHCPLeases包含Mac和IP,约3000件
我想创建一个新的列表,其中包含用户名和IP,其中Byods列表居首,IP从DHCPlies中找到,只包含找到匹配的记录(左连接?)

我创建了一个foreach循环,完成了这项工作。然而,它需要大量的时间来完成(>30分钟)。

我相信这会更快。有人吗

$UserByods = @()
foreach ($lease in $DHCPLeases) 
{
    $MAC = [string]$lease.MAC
    $UserByod = @()
    $UserByod = $Byods | where {$_.MAC -eq $MAC}
    if (($UserByod | measure).count -eq 1) {
        $ByodIP = New-Object -TypeName PSObject
        $ByodIP | Add-Member -Name 'User' -MemberType Noteproperty -Value $UserByod.Username
        $ByodIP | Add-Member -Name 'IP' -MemberType Noteproperty -Value $lease.IP
        $UserByods += $ByodIP
    }
}

在循环中附加到数组的速度很慢。只需在循环中输出自定义对象,并在变量
$UserByods
中收集循环输出。列表上的线性读取也很慢。最好从
$Byods
构建一个哈希表,这样您就可以根据设备的MAC地址查找设备

$tbl = @{}
$Byods | ForEach-Object { $tbl[$_.MAC] = $_ }

$UserByods = foreach ($lease in $DHCPLeases) {
    New-Object -TypeName PSObject -Property @{
        'User' = $tbl[$lease.MAC].Username
        'IP'   = $lease.IP
    }
}

这里可以做一些改进。首先,不要使用
addmember
来构造对象,这比预先指定属性要慢得多

您还希望避免在集合上使用加法运算符(
+=
),因为它会导致调整基础数组的大小,这是一个占用大量内存的操作

最后,为MAC相关性使用哈希表,它将比在所有5000个条目中循环3000次要快得多(这就是
…|{…}
基本上所做的):


我没有您的列表,但我想知道我的cmdlet在这方面的性能如何。
命令应该是这样的:

$Byods | LeftJoin $DHCPLeases Mac

我在性能方面做了一些努力,但由于这是一个通用解决方案,它可能无法与这里给出的特定解决方案竞争

首先:将$userbyods+=替换为类似list.add()的内容(首先创建一个新列表)。使用+=在每次迭代时创建数组的副本。第二:你们可以用秒表在两个步骤之间划上一段距离来检查性能,看看哪些步骤需要“很长”的时间才能完成。哇,太谢谢你们了!这将脚本缩短到2秒!
$Byods | LeftJoin $DHCPLeases Mac