Schnellere PowerShell Where-Object Abfrage

Der Where-Object PowerShell Befehl ist nicht unbedingt der schnellste Befehl, wenn man damit versucht etwas in größeren Objekten zu finden, oder wenn er innerhalb von Schleifen oft benutzt wird, können sich die Ausführungszeiten massiv aufaddieren.

Eine mögliche Lösung für die Problematik stellt der folgende kleine CSharp Codeblock dar, denn man innerhalb von PowerShell alternativ benutzen kann.

Zeile 1-22 stellt die benötigte CSharp Logik innerhalb von PowerShell bereit
Zeile 27-30 zeigt als Negativbeispiel die Verwendung von Where-Object und miss dessen Ausführungszeit
Zeile 32-35 zeigt die alternative Verwendung der CSharp FastSearch Logik und misst dessen Ausführungszeit

Die Ausführungszeit ist von vielen Faktoren abhängig, wie z.B. der Objektgröße, bei meinen Test war die CSharp Logik um den Faktor 5-20 schneller

# FastSearch function
$Source = @"
using System;
using System.Management.Automation;
using System.Collections.Generic;
namespace FastSearch
{
    public static class Search
    {
        public static List Find(PSObject[] collection, string column, string data)
        {
            List results = new List();
            foreach(PSObject item in collection)
            {
                if (item.Properties[column].Value.ToString() == data) { results.Add(item); }
            }
            return results;
        }
    }
}
"@
Add-Type -TypeDefinition $Source -Language CSharp

# Get an example object with many entries
$ExampleObject  = Get-EventLog -LogName Information -Newest 50000

# Example search with Where-Object and measure the execution time
Measure-Command {
    $Result = $ExampleObject | Where-Object {$_.EntryType -eq 'Error'}
}

# Example search with FastSearch
Measure-Command {
    $Result = [FastSearch.Search]::Find($ExampleObject,'EntryType','Error')
}
​

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert