PowerShellPerformance/What_Is_The_Fastest_Way_To_Get_All_Loaded_Modules.benchmark.ps1

#requires -Module Benchpress
bench -Technique @{
    'ExecutionContextAndHashtable' = {
        $cmds = $ExecutionContext.InvokeCommand.GetCommands('*', 'Function,Cmdlet,Alias', $true)
        $cmdModules = @{}

        foreach ($_ in $cmds) {
            if (-not $_.Module) { continue } 
            if (-not $cmdModules[$_.Module.Name]) {
                $cmdModules[$_.Module.Name] = $_
            }
        }

        $cmdModules.Keys
    }
    'ExecutionContextAndArrayList' = {
            $cmds = $ExecutionContext.InvokeCommand.GetCommands('*', 'Function,Cmdlet,Alias', $true)
            $moduleNames = [Collections.ArrayList]::new()

            foreach ($_ in $cmds) {
                if (-not $_.Module.Name) { continue } 
                if ($moduleNames -notcontains $_.Module.Name) {
                    $null = $moduleNames.Add($_.Module.Name)
                }
            }
            $moduleNames
    }

    'Get-Module -ExpandProperty Name' = {
        $moduleNames = Get-Module | Select-Object -ExpandProperty Name
        $moduleNames
    }
    'foreach Get-Module' = {
        $moduleNames = foreach ($_ in Get-Module) {
            $_.Name
        }
        $moduleNames
    }

} -RepeatCount 10