标题: [技术讨论] PowerShell的Sort的一些发现 [打印本页]
作者: Nsqs 时间: 2023-10-14 08:54 标题: PowerShell的Sort的一些发现
本帖最后由 Nsqs 于 2023-10-16 18:43 编辑
自带的sort速度似乎是没有net里的Array.sort类速度快
测试如下:
自带Sort:2.1384342
Array.Sort:0.0969742
倒序数组转正序200000..1测试
同样的好像不止这一个自带的函数,似乎还有其他的自带函数性能比较低,暂时想不到(忘了)
作者: Nsqs 时间: 2023-10-14 09:23
- $x=200000..1
- $sw=[System.Diagnostics.Stopwatch]::new()
- $sw.Start()
- $c=$x|sort
- $sw.Elapsed.TotalMilliseconds/1000
- $sw.Restart()
- [array]::Sort($x)
- $sw.Elapsed.TotalMilliseconds/1000
- $sw.Stop()
复制代码
作者: Nsqs 时间: 2023-10-14 14:23
破案了,最新发现新版7.4中用同样的自带sort函数进行测试发现
20万循环
5.1用时 2s
7.4用时 1.2s
虽然还是慢,但是说明一点,更高版本的sort有做优化
作者: Five66 时间: 2023-10-14 18:30
powershell的管道不是本来就慢?
自带sort貌似只能以管道的方式执行,
如果能用sort -i (200000..1)这种方式直接执行的话应该都差不多吧
作者: Nsqs 时间: 2023-10-15 00:05
回复 4# Five66
管道么?根据我的使用感受,在大部分情况下管道速度比常规foreach都要快。觉得慢,可能还是其他优化没做好吧,以前我也一度认为管道慢,用多了发现之前观点可能是错的
作者: Five66 时间: 2023-10-15 01:51
回复 5# Nsqs
说到管道,第一时间就想起了下面的链接里的文章
https://www.pstips.net/speeding-up-powershell-multithreading.html
以前的话,管道确实是有点慢的,不知现在怎样了
作者: Nsqs 时间: 2023-10-15 08:59
本帖最后由 Nsqs 于 2023-10-15 09:03 编辑
回复 6# Five66
那肯定啊,你觉得是if(){}快还是xxx|?{}|%{}快,是差不多的一个道理,管道快肯定是快的,但是要选择合理的时候用,不可能一直都用管道的,另外如果1..1000000|get-random单独拎出来临时或者反复用,速度肯定很慢,但如果前面的数组是提前准备好的,直接读的话就会很快了。这个也是有区别的。
作者: yyz219 时间: 2023-10-15 12:35
谢谢分享了
作者: Five66 时间: 2023-10-16 17:55
回复 9# Nsqs
呃,并不能使用sort -InputObject $arr,$arr会被看成1个对象,只排序这1个对象,结果就是$arr里面的元素不会排序,返回的结果中的元素也不会排序,至少5.1版本是这样的,7.4没用过不知道
管道慢大概是因为有对象的io,没有io 应该是挺快的,毕竟管道跟并发(并行)处理其实有点相似(???),不过数据量级较小时差异也不大
排序时“等待输入到管道的所有对象完毕后才排序”跟“边输入边计算比较”是不同的,也许大概或许是优化的这里吧
作者: Nsqs 时间: 2023-10-16 18:49
本帖最后由 Nsqs 于 2023-10-16 18:50 编辑
回复 9# Five66
是我看错了,我把已经排序过的结果看成sort再次排序以为时间变短了
也就是说自带的排序管道的效率真的很低,至少c#这边20亿用时6秒左右吧,还能接受,配置好的估计2秒就能排完
如果自带排序效率低的话就只能用array.sort了,另外自带的排序速度比JavaScript还慢
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |