{"id":3205,"date":"2020-11-23T22:21:54","date_gmt":"2020-11-23T21:21:54","guid":{"rendered":"https:\/\/www.mariotti.de\/?p=3205"},"modified":"2020-11-23T22:21:54","modified_gmt":"2020-11-23T21:21:54","slug":"schnellere-powershell-where-object-abfrage","status":"publish","type":"post","link":"https:\/\/dev.mariotti.de\/?p=3205","title":{"rendered":"Schnellere PowerShell Where-Object Abfrage"},"content":{"rendered":"<p>Der Where-Object PowerShell Befehl ist nicht unbedingt der schnellste Befehl, wenn man damit versucht etwas in gr\u00f6\u00dferen Objekten zu finden, oder wenn er innerhalb von Schleifen oft benutzt wird, k\u00f6nnen sich die Ausf\u00fchrungszeiten massiv aufaddieren.<\/p>\n<p>Eine m\u00f6gliche L\u00f6sung f\u00fcr die Problematik stellt der folgende kleine CSharp Codeblock dar, denn man innerhalb von PowerShell alternativ benutzen kann.<\/p>\n<p>Zeile 1-22 stellt die ben\u00f6tigte CSharp Logik innerhalb von PowerShell bereit<br \/>\nZeile 27-30 zeigt als Negativbeispiel die Verwendung von Where-Object und miss dessen Ausf\u00fchrungszeit<br \/>\nZeile 32-35 zeigt die alternative Verwendung der CSharp FastSearch Logik und misst dessen Ausf\u00fchrungszeit<\/p>\n<p>Die Ausf\u00fchrungszeit ist von vielen Faktoren abh\u00e4ngig, wie z.B. der Objektgr\u00f6\u00dfe, bei meinen Test war die CSharp Logik um den Faktor 5-20 schneller<\/p>\n<pre><code class=\"language-powershell\"># FastSearch function\n$Source = @\"\nusing System;\nusing System.Management.Automation;\nusing System.Collections.Generic;\nnamespace FastSearch\n{\n    public static class Search\n    {\n        public static List<object width=\"300\" height=\"150\" data-mce-fragment=\"1\"> Find(PSObject[] collection, string column, string data)\n        {\n            List<object> results = new List<object>();\n            foreach(PSObject item in collection)\n            {\n                if (item.Properties[column].Value.ToString() == data) { results.Add(item); }\n            }\n            return results;\n        }\n    }\n}\n\"@\nAdd-Type -TypeDefinition $Source -Language CSharp\n\n# Get an example object with many entries\n$ExampleObject  = Get-EventLog -LogName Information -Newest 50000\n\n# Example search with Where-Object and measure the execution time\nMeasure-Command {\n    $Result = $ExampleObject | Where-Object {$_.EntryType -eq 'Error'}\n}\n\n# Example search with FastSearch\nMeasure-Command {\n    $Result = [FastSearch.Search]::Find($ExampleObject,'EntryType','Error')\n}\n<span id=\"mce_marker\" data-mce-type=\"bookmark\">\ufeff\u200b<\/span><\/object><\/object><\/object><\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Der Where-Object PowerShell Befehl ist nicht unbedingt der schnellste Befehl, wenn man damit versucht etwas in gr\u00f6\u00dferen Objekten zu finden, oder wenn er innerhalb von Schleifen oft benutzt wird, k\u00f6nnen sich die Ausf\u00fchrungszeiten massiv aufaddieren. Eine m\u00f6gliche L\u00f6sung in Form eines kleinen CSharp Codeblocks zeige ich hier<\/p>\n","protected":false},"author":2,"featured_media":2425,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[37],"tags":[],"class_list":["post-3205","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-powershell"],"_links":{"self":[{"href":"https:\/\/dev.mariotti.de\/index.php?rest_route=\/wp\/v2\/posts\/3205","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dev.mariotti.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dev.mariotti.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dev.mariotti.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/dev.mariotti.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3205"}],"version-history":[{"count":0,"href":"https:\/\/dev.mariotti.de\/index.php?rest_route=\/wp\/v2\/posts\/3205\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/dev.mariotti.de\/index.php?rest_route=\/wp\/v2\/media\/2425"}],"wp:attachment":[{"href":"https:\/\/dev.mariotti.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3205"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dev.mariotti.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3205"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dev.mariotti.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3205"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}