【发布时间】:2018-08-25 08:19:03
【问题描述】:
昨晚我玩弄了一些用 PowerShell 编写的排序算法。事先我必须生成一个随机整数数组,这样我就有了可以排序的东西。但是,生成数组的时间太长了,所以我改进了我的代码以尽可能快地运行。
我的最终代码如下所示:
$max = 1000000
$RndNumberArr = New-Object System.Collections.ArrayList
$ran = New-Object Random
for ($i = 0; $i -lt $max; $i++)
{
[void]$RndNumberArr.Add($ran.Next(0,$max))
}
使用 Measure-Command,我的平均执行时间约为 2.5 秒。
我注意到使用ArrayList 比使用固定大小的数组更快(这对我来说没有多大意义,有更快的方法吗?)
此外,使用 .NET 方法 random.Next() 而不是 CMDLet Get-Random 也可以大大提高速度(节省了大约 30 秒)。
使用 .NET 方法有什么缺点吗?
我也认为使用
[void]$RndNumberArr.Add($ran.Next(0,$max))
防止Array.Add输出比使用略快
$RndNumberArr.Add($ran.Next(0,$max)) > $null
我说的对吗?
CMDLet 有明显的时差是最慢的。
$RndNumberArr.Add($ran.Next(0,$max)) | Out-Null
我的计算机硬件(尤其是 CPU)是否会影响 PowerShell 的执行速度,或者速度是否在某个时候受到了限制?如果是这样,有没有办法增强分配的系统资源以提高速度?
非常感谢。
【问题讨论】:
-
不,除了可读性和“最佳实践”之外,使用 .net 方法没有任何缺点。但是,当您像现在这样进行性能改进时,有时它们是获得改进的唯一方法。
-
顺便说一句:注意this GitHub feature request 以添加对
Get-Randomcmdlet 创建多个值的支持。
标签: arrays performance powershell arraylist