本帖最后由 Nsqs 于 2023-10-21 07:49 编辑
重新修改了一下,感觉这样对比更加有说服力一点了
第一轮对比scriptblock与function
0.36s
1.18s
第二轮func与function
1.18s
1.16s
第三轮action与function
0.34s
1.19s
func委托函数套在函数里与直接用func委托的测试:- using namespace System.Collections
- using namespace System.Collections.Generic
- using namespace System.Diagnostics
- function func($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)
- }
- [List[int]]$la=@{}
- [func[int,ilist]]$fn={param($x)$la.Add($x);if($x -eq 1){return $l}else{$x--}$fn.Invoke($x)}
- [Stopwatch]$sw=@{}
- $sw.Start()
- 1..1000|%{$x=func 10}
- $t=$sw.Elapsed.TotalSeconds.ToString('0.00s')
- $sw.Restart()
- 1..1000|%{$la=@{};$r=$fn.Invoke(10)}
- $t;$sw.Elapsed.TotalSeconds.ToString('0.00s')
- $sw.Stop()
复制代码 运行结果:
1.16s
0.32s
也就是说如果你想写递归的话,性能方面写直接单写一个function和function+func是一样的如果在function里再写func
既然速度是一样的就不如直接写func来的快
想偷懒又想在function里写函数用 $scriptblock=#{脚本块} 能节省一些代码量,可以不用声明
这是AI的回答:
在 PowerShell 中,闭包是指一个函数可以访问在其定义之外定义的变量。当您在函数内部调用 func 时,
每次调用都会创建一个新的闭包对象,该闭包对象包含了函数定义时所捕获的变量。这样会导致每次调用 func 时都需要创建新的闭包对象。
根据AI的回答,大概是因为scriptblock是PowerShell独有的方法
套在函数内不需要额外创建新的委托因此function里写func委托函数每次调用 function 都会重新创建一个委托函数
scriptblock则不用..所以直接调用$fn.Invoke()效率会比套在function里的$fn速度更快
我这个测试结果是在ise内测试的,如果双击运行脚本速度只能更快 |