我编写了一个PowerShell脚本,需要在函数之间传递大字节数组.脚本运行速度非常慢.下面的示例代码重现了该问题.它只是将一个10 MiB数组传递给一个不执行任何操作的函数(除了记录消息),并测量调用所需的时间.
function do-nothing { param($foo) Write-Verbose -Verbose "in the function" } $tenMiB = 10 * 1024 * 1024 $myFoo = New-Object byte[] $tenMiB Write-Verbose -Verbose "about to do call a function that does nothing..." $elapsed = Measure-Command -Expression { do-nothing -foo $myFoo } Write-Verbose -Verbose "doing nothing took $($elapsed.TotalMilliseconds) milliseconds"
我希望这需要几毫秒.在我的家用电脑上,它需要将近3000毫秒,并以100%的速度运行CPU核心.我使用PowerShell 4和PowerShell 5(预生产版本)获得了相同的结果.我的工作PC和服务器也发生了同样的事情.但是,一位同事获得了预期的结果 - 执行几毫秒,CPU使用率最低.
执行时间大致与数组的大小成正比,这对我来说毫无意义.阵列的大小无关紧要.
我想知道数组是否以某种方式被复制.我不认为是这种情况,因为调用GetHashCode()
数组会返回函数内部和外部的相同值.
如果数组包装在a中PSCustomObject
,并且包装器被传递给函数,则代码将按预期执行.作为一种解决方法,这有点难看,我宁愿在诉诸之前了解正在发生的事情.
有谁能解释这看似奇怪的行为吗?