[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[技术讨论] PowerShell的Sort的一些发现

本帖最后由 Nsqs 于 2023-10-16 18:43 编辑

自带的sort速度似乎是没有net里的Array.sort类速度快

测试如下:

自带Sort:2.1384342
Array.Sort:0.0969742

倒序数组转正序200000..1测试

同样的好像不止这一个自带的函数,似乎还有其他的自带函数性能比较低,暂时想不到(忘了)

  1. $x=200000..1
  2. $sw=[System.Diagnostics.Stopwatch]::new()
  3. $sw.Start()
  4. $c=$x|sort
  5. $sw.Elapsed.TotalMilliseconds/1000
  6. $sw.Restart()
  7. [array]::Sort($x)
  8. $sw.Elapsed.TotalMilliseconds/1000
  9. $sw.Stop()
复制代码

TOP

破案了,最新发现新版7.4中用同样的自带sort函数进行测试发现

20万循环
5.1用时 2s
7.4用时 1.2s

虽然还是慢,但是说明一点,更高版本的sort有做优化

TOP

powershell的管道不是本来就慢?
自带sort貌似只能以管道的方式执行,
如果能用sort -i (200000..1)这种方式直接执行的话应该都差不多吧

TOP

回复 4# Five66


    管道么?根据我的使用感受,在大部分情况下管道速度比常规foreach都要快。觉得慢,可能还是其他优化没做好吧,以前我也一度认为管道慢,用多了发现之前观点可能是错的

TOP

回复 5# Nsqs


说到管道,第一时间就想起了下面的链接里的文章
https://www.pstips.net/speeding-up-powershell-multithreading.html
以前的话,管道确实是有点慢的,不知现在怎样了

TOP

本帖最后由 Nsqs 于 2023-10-15 09:03 编辑

回复 6# Five66


    那肯定啊,你觉得是if(){}快还是xxx|?{}|%{}快,是差不多的一个道理,管道快肯定是快的,但是要选择合理的时候用,不可能一直都用管道的,另外如果1..1000000|get-random单独拎出来临时或者反复用,速度肯定很慢,但如果前面的数组是提前准备好的,直接读的话就会很快了。这个也是有区别的。

TOP

谢谢分享了
我是小白,希望老师多多帮助

TOP

回复 9# Nsqs


呃,并不能使用sort -InputObject $arr,$arr会被看成1个对象,只排序这1个对象,结果就是$arr里面的元素不会排序,返回的结果中的元素也不会排序,至少5.1版本是这样的,7.4没用过不知道
管道慢大概是因为有对象的io,没有io 应该是挺快的,毕竟管道跟并发(并行)处理其实有点相似(???),不过数据量级较小时差异也不大
排序时“等待输入到管道的所有对象完毕后才排序”跟“边输入边计算比较”是不同的,也许大概或许是优化的这里吧

TOP

本帖最后由 Nsqs 于 2023-10-16 18:50 编辑

回复 9# Five66


    是我看错了,我把已经排序过的结果看成sort再次排序以为时间变短了

也就是说自带的排序管道的效率真的很低,至少c#这边20亿用时6秒左右吧,还能接受,配置好的估计2秒就能排完

如果自带排序效率低的话就只能用array.sort了,另外自带的排序速度比JavaScript还慢

TOP

返回列表