在PowerShell中有两个从字面上看非常相似的语句就是Foreach与Foreach-Object了,那么多这两个语句之间除了写法不同,性能上哪个更快呢下面写同时让这两个语句处理10万个对象,在去计算它们所消耗的时间。
function Foreach_test
{
foreach($i in 1..100000)
{
$i
}
}
function Foreach_Object_test
{
1..100000|ForEach-Object{$_}
}
Write-Host "Foreach-Object Statement: $(Measure-Command{Foreach_Object_test}|%{$_.TotalMilliseconds}) Milliseconds"
Write-Host "Foreach Statement: $(Measure-Command{Foreach_test}|%{$_.TotalMilliseconds}) Milliseconds"
Write-Host "============================"
Write-Host "Foreach-Object Statement: $(Measure-Command{Foreach_Object_test}|%{$_.TotalMilliseconds}) Milliseconds"
Write-Host "Foreach Statement: $(Measure-Command{Foreach_test}|%{$_.TotalMilliseconds}) Milliseconds"
Write-Host "============================"
Write-Host "Foreach-Object Statement: $(Measure-Command{Foreach_Object_test}|%{$_.TotalMilliseconds}) Milliseconds"
Write-Host "Foreach Statement: $(Measure-Command{Foreach_test}|%{$_.TotalMilliseconds}) Milliseconds"
Write-Host "============================"
根据结果,我们可以发现foreach的效率速度远远快于foreach-object,整整相差了200多倍。
foreach(){}
要在同一次聚集所有的对象,所以需要足够多的内存
foreach-object
每次只读写一个对象所以只需要极少的内存存储。
不过最终无论使用哪个都可以,这完全着眼于手边的解决方案而定。一般数量的执行使用foreach足矣了。