[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]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

回复 4# Five66


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

TOP

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

回复 6# Five66


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

TOP

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

回复 9# Five66


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

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

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

TOP

返回列表