在 .ForEach() 方法中使用 continue/return 语句 - 使用 foreach ($item in $collection) 是否更好?

问题描述 投票:0回答:1

有据可查,foreach 处理速度根据 foreach 循环的执行方式而变化(从最快到最慢排序):

  1. .ForEach()
    方法
  2. foreach($collection 中的 $item){}
  3. $收藏| ForEach-Object {}


  • 当处理(very)大型集合时,#1 和 #2 之间的速度比较可能很重要,并且管道的开销使得#3 在这些情况下不适合。
  • #2 提供了
    continue
    语句,而 #1 没有
    • 如有不准确请指正/评论
  • 从我在网上和现实生活中看到的,
  • return
    是如何在使用
    continue
    方法时“
    .ForEach()
    ”。



我的问题:

  1. .ForEach()
    方法的速度优势太大而无法满足于
    foreach
    而需要
    continue
    时,使用
    continue
    时正确的
    .ForEach({})
    方法是什么?
  2. return
     方法中使用 
    .ForEach()
     时,您应该注意哪些含义或陷阱?
powershell loops foreach return continue
1个回答
0
投票
...在这些情况下,管道的开销使得#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
    
© www.soinside.com 2019 - 2024. All rights reserved.