有据可查,foreach 处理速度根据 foreach 循环的执行方式而变化(从最快到最慢排序):
.ForEach()
方法continue
语句,而 #1 没有
return
是如何在使用
continue
方法时“
.ForEach()
”。
.ForEach()
方法的速度优势太大而无法满足于
foreach
而需要
continue
时,使用
continue
时正确的
.ForEach({})
方法是什么?
return
方法中使用
.ForEach()
时,您应该注意哪些含义或陷阱?
...在这些情况下,管道的开销使得#3 不再是候选者。不正确,管道非常高效,它几乎与
foreach
(PowerShell 中枚举集合的最快方法)配对。
ForEach-Object
是低效的,因为它不提供脚本块。
.ForEach
几乎从来都不是一个好的选择,下面的测试清楚地表明了这一点。此外,输出类型始终为
Collection<T>
:
''.ForEach({ }).GetType()
# Namespace: System.Collections.ObjectModel
#
# Access Modifiers Name
# ------ --------- ----
# public class Collection<PSObject>...
.ForEach
不流输出,这意味着无法使用
Select-Object -First
:提前退出循环
Measure-Command {
(0..10).ForEach({ $_; Start-Sleep -Milliseconds 200 }) | Select-Object -First 1
} | ForEach-Object TotalSeconds
# 2.2637483
如果您正在寻找性能,您应该依赖 foreach
或带有
process
的脚本块或带有
process
块的函数。
$range = [System.Linq.Enumerable]::Range(0, 1mb)
$tests = @{
'foreach' = {
foreach ($i in $args[0]) { $i }
}
'.ForEach()' = {
$args[0].ForEach({ $_ })
}
'ForEach-Object' = {
$args[0] | ForEach-Object { $_ }
}
'process block' = {
$args[0] | & { process { $_ } }
}
}
$tests.GetEnumerator() | ForEach-Object {
[pscustomobject]@{
Test = $_.Key
Time = (Measure-Command { & $_.Value $range }).TotalMilliseconds
}
} | Sort-Object Time
# Test Time
# ---- ----
# foreach 103.96
# process block 918.04
# .ForEach() 3614.44
# ForEach-Object 9046.14