本帖最后由 Nsqs 于 2023-10-21 06:51 编辑
第一段 用scriptblock测试- using namespace System.Collections
- using namespace System.Collections.Generic
- using namespace System.Diagnostics
- [Stopwatch]$sw=@{}
- [List[int]]$ll=@{}
- function m($a){
- [List[int]]$l=@{}
- [scriptblock]$fn={param($x)$l.Add($x);if($x -eq 1){return $l}else{$x--}$fn.Invoke($x)}
- $fn.Invoke($a)
- }
- function fn($x){$ll.Add($x);if($x -eq 1){return $ll}else{$x--}fn $x}
- $sw.Start()
- $a=1..1000|%{$x=m 10}
- $t=$sw.Elapsed.TotalSeconds.ToString('0.00s')
- $ll.Clear()
- $sw.Restart()
- $b=1..1000|%{$x=fn 10}
- $t;$sw.Elapsed.TotalSeconds.ToString('0.00s')
- $sw.Stop()
复制代码 第二段 用func测试- using namespace System.Collections
- using namespace System.Collections.Generic
- using namespace System.Diagnostics
- [Stopwatch]$sw=@{}
- [List[int]]$ll=@{}
- function m($a){
- [List[int]]$l=@{}
- [func[int,IList]]$fn={param($x)$l.Add($x);if($x -eq 1){return $l}else{$x--}$fn.Invoke($x)}
- $fn.Invoke($a)
- }
- function fn($x){$ll.Add($x);if($x -eq 1){return $ll}else{$x--}fn $x}
- $sw.Start()
- $a=1..1000|%{$x=m 10}
- $t=$sw.Elapsed.TotalSeconds.ToString('0.00s')
- $ll.Clear()
- $sw.Restart()
- $b=1..1000|%{$x=fn 10}
- $t;$sw.Elapsed.TotalSeconds.ToString('0.00s')
- $sw.Stop()
复制代码 第三段 用action测试- using namespace System.Collections
- using namespace System.Collections.Generic
- using namespace System.Diagnostics
- [Stopwatch]$sw=@{}
- [List[int]]$ll=@{}
- function m($a){
- [List[int]]$l=@{}
- [scriptblock]$fn={param($x)$l.Add($x);if($x -eq 1){$global:res=$l;return}else{$x--}$fn.Invoke($x)}
- $fn.Invoke($a)
- }
- function fn($x){$ll.Add($x);if($x -eq 1){return $ll}else{$x--}fn $x}
- $sw.Start()
- $a=1..1000|%{m 10;$x=$res}
- $t=$sw.Elapsed.TotalSeconds.ToString('0.00s')
- $ll.Clear()
- $sw.Restart()
- $b=1..1000|%{$x=fn 10}
- $t;$sw.Elapsed.TotalSeconds.ToString('0.00s')
- $sw.Stop()
复制代码 结果就不公布了,每台电脑计算力不一样,自己去体会
可以肯定一点的是性能这一块function,只能算是个中庸吧,玩递归的话,还是慎重考虑 |