{"id":5816,"date":"2022-07-07T00:03:52","date_gmt":"2022-07-07T00:03:52","guid":{"rendered":"https:\/\/pariswells.com\/blog\/?p=5816"},"modified":"2022-07-07T00:03:52","modified_gmt":"2022-07-07T00:03:52","slug":"speeding-up-addition-in-arrays-in-powershell","status":"publish","type":"post","link":"https:\/\/pariswells.com\/blog\/research\/speeding-up-addition-in-arrays-in-powershell","title":{"rendered":"Speeding up Addition in Arrays in Powershell"},"content":{"rendered":"<p class=\"x_MsoNormal\">Note that the use of the += addition operator on an array in powershell can run \/very\/ slowly if you\u2019re working with a large array. This is because under the hood an array is allocated a fixed chunk of memory and modifying the array requires creating a newly sized fixed chunk of memory and copying all of the data into the new memory.<\/p><p class=\"x_MsoNormal\"><a href=\"https:\/\/docs.microsoft.com\/en-us\/powershell\/scripting\/dev-cross-plat\/performance\/script-authoring-considerations?view=powershell-7.2#array-addition\" target=\"_blank\" rel=\"noopener noreferrer\" data-auth=\"NotApplicable\" data-linkindex=\"0\">https:\/\/docs.microsoft.com\/en-us\/powershell\/scripting\/dev-cross-plat\/performance\/script-authoring-considerations?view=powershell-7.2#array-addition<\/a><\/p><p class=\"x_MsoNormal\">There are two ways of working around this. Either by using a c# type System.Collection.ArrayList or by using a neat powershell trick (below). If you\u2019re only working on small arrays the overhead of this is going to be negligible and may not warrant rewriting to an arraylist.<\/p><p class=\"x_MsoNormal\" aria-hidden=\"true\">\u00a0<\/p><p>[pastacode lang=&#8221;powershell&#8221; manual=&#8221;Slow%20Example%0A%0A%23%20an%20empty%20array%20is%20used%20as%20a%20bucket%20to%20collect%20results%3A%0A%0A%24bucket%C2%A0%3D%C2%A0%40()%0A%0A%0A%0A%0A%23%20use%20a%20stopwatch%20to%20measure%20performance%0A%0A%24stopwatch%C2%A0%3D%C2%A0%5BSystem.Diagnostics.Stopwatch%5D%3A%3AStartNew()%0A%0A%0A%0A%0A%23%20a%20loop%20does%20something%2C%20i.e.%20scans%20computers%2C%20processes%20database%20records%2C%0A%0A%23%20examines%20files%2C%20etc.%3A%0A%0A1..10000%C2%A0%7C%C2%A0Foreach-Object%C2%A0%7B%0A%0A%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%23%20result%20are%20added%20to%20the%20bucket%20using%20the%20%22%2B%3D%22%20operator%0A%0A%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%24bucket%C2%A0%2B%3D%C2%A0%22I%20am%20adding%C2%A0%24_%22%0A%0A%7D%0A%0A%0A%0A%0A%23%20all%20results%20end%20up%20in%20the%20array%3A%0A%0A%24report%C2%A0%3D%C2%A0&#8217;%7B0%7D%20elements%20collected%20in%20%7B1%3An1%7D%20seconds&#8217;%0A%0A%24report%C2%A0-f%C2%A0%24bucket.Count%2C%C2%A0%24stopwatch.Elapsed.TotalSeconds%0A%0A%0A%0A%0A10000%20elements%20collected%20in%205.2%20seconds%0A%0A%0A%0A%0AFast%20example%0A%0A%0A%0A%0A%23%20an%20empty%20ArrayList%20is%20used%20as%20a%20bucket%20to%20collect%20results%3A%0A%0A%24bucket%C2%A0%3D%C2%A0%5BSystem.Collections.ArrayList%5D%40()%0A%0A%0A%0A%0A%23%20use%20a%20stopwatch%20to%20measure%20performance%0A%0A%24stopwatch%C2%A0%3D%C2%A0%5BSystem.Diagnostics.Stopwatch%5D%3A%3AStartNew()%0A%0A%0A%0A%0A%23%20a%20loop%20does%20something%2C%20i.e.%20scans%20computers%2C%20processes%20database%20records%2C%0A%0A%23%20examines%20files%2C%20etc.%3A%0A%0A1..10000%C2%A0%7C%C2%A0Foreach-Object%C2%A0%7B%0A%0A%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%23%20result%20are%20added%20using%20the%20Add()%20method%0A%0A%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%20%24null%C2%A0%3D%C2%A0%24bucket.Add(%22I%20am%20adding%C2%A0%24_%22)%0A%0A%7D%0A%0A%0A%0A%0A%23%20all%20results%20end%20up%20in%20the%20array%3A%0A%0A%24report%C2%A0%3D%C2%A0&#8217;%7B0%7D%20elements%20collected%20in%20%7B1%3An1%7D%20seconds&#8217;%0A%0A%24report%C2%A0-f%C2%A0%24bucket.Count%2C%C2%A0%24stopwatch.Elapsed.TotalSeconds%0A%0A%0A%0A%0A10000%20elements%20collected%20in%201.7%20seconds%0A%0A%0A%0A%0AEven%20faster%20example%0A%0A%23%20use%20a%20stopwatch%20to%20measure%20performance%0A%0A%24stopwatch%C2%A0%3D%C2%A0%5BSystem.Diagnostics.Stopwatch%5D%3A%3AStartNew()%0A%0A%0A%0A%0A%23%20let%20PowerShell%20handle%20object%20creation%0A%0A%24bucket%C2%A0%3D%C2%A01..10000%C2%A0%7C%C2%A0Foreach-Object%C2%A0%7B%0A%0A%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%23%20simply%20return%20the%20result%0A%0A%C2%A0%C2%A0%C2%A0%C2%A0%23%20PowerShell%20wraps%20all%20results%20in%20an%20array%20automatically%0A%0A%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%22I%20am%20adding%C2%A0%24_%22%0A%0A%7D%0A%0A%0A%0A%0A%23%20all%20results%20end%20up%20in%20the%20array%3A%0A%0A%24report%C2%A0%3D%C2%A0&#8217;%7B0%7D%20elements%20collected%20in%20%7B1%3An1%7D%20seconds&#8217;%0A%0A%24report%C2%A0-f%C2%A0%24bucket.Count%2C%C2%A0%24stopwatch.Elapsed.TotalSeconds%0A%0A%0A%0A%0A10000%20elements%20collected%20in%200.8%20seconds&#8221; message=&#8221;&#8221; highlight=&#8221;&#8221; provider=&#8221;manual&#8221;\/]<\/p>","protected":false},"excerpt":{"rendered":"<p>Note that the use of the += addition operator on an array in powershell can run \/very\/ slowly if you\u2019re working with a large array. This is [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-5816","post","type-post","status-publish","format-standard","hentry","category-research"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/pariswells.com\/blog\/wp-json\/wp\/v2\/posts\/5816","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pariswells.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pariswells.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/pariswells.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/pariswells.com\/blog\/wp-json\/wp\/v2\/comments?post=5816"}],"version-history":[{"count":1,"href":"https:\/\/pariswells.com\/blog\/wp-json\/wp\/v2\/posts\/5816\/revisions"}],"predecessor-version":[{"id":5817,"href":"https:\/\/pariswells.com\/blog\/wp-json\/wp\/v2\/posts\/5816\/revisions\/5817"}],"wp:attachment":[{"href":"https:\/\/pariswells.com\/blog\/wp-json\/wp\/v2\/media?parent=5816"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pariswells.com\/blog\/wp-json\/wp\/v2\/categories?post=5816"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pariswells.com\/blog\/wp-json\/wp\/v2\/tags?post=5816"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}