返回列表 发帖

[问题求助] 有没有文档可以解释PowerShell的Object[]速度比int[]还要快的原因呀?

$sw=[System.Diagnostics.Stopwatch]::new()
do{
    $sw.Start()
    $max=1000000
    [int[]]$arr=1..$max
    $t1=$sw.Elapsed.TotalSeconds.ToString('0.00s')
    $sw.Stop()
    $sw.Reset()
    $sw.Start()
    [object[]]$arr=1..$max
    $t2=$sw.Elapsed.TotalSeconds.ToString('0.00s')
    $sw.Stop()
    $t1,$t2
    cmd /c pause
}until(0)COPY
上面的t2简直快到没朋友了,不是一般来说Object占用内存是最大的吗,速度应该也是最慢吧?怎么会快那么多?

在我电脑上测试5组数据比较
结果如下:
0.43s
0.04s
请按任意键继续. . .
0.35s
0.02s
请按任意键继续. . .
0.40s
0.07s
请按任意键继续. . .
0.33s
0.02s
请按任意键继续. . .
0.36s
0.02s
请按任意键继续. . .

本帖最后由 bylove 于 2023-9-14 17:31 编辑

我在vba里的测试结果如下(换成1个亿):
Sub main()
    Max = 100000000
    ReDim arr&(Max)
    For j = 1 To 5
    t = Timer
        For i& = 0 To Max
            arr(i) = i
        Next
        Debug.Print Format(Timer - t, "0.00s")
    Next
End SubCOPY
int[]
1.11s
1.12s
1.13s
1.14s
1.13s
Sub main()
    Max = 100000000
    ReDim arr(Max)
    For j = 1 To 5
    t = Timer
        For i& = 0 To Max
            arr(i) = i
        Next
        Debug.Print Format(Timer - t, "0.00s")
    Next
End SubCOPY
Variant[]
1.62s
1.60s
1.56s
1.54s
1.60s


我很意外,vba速度居然完爆PowerShell

TOP

本帖最后由 bylove 于 2023-9-14 17:30 编辑
$sw=[System.Diagnostics.Stopwatch]::new()
$sw.Start()
$max=100000000
[object[]]$arr=1..$max
$t1=$sw.Elapsed.TotalSeconds.ToString('0.00s')
$sw.Stop()
$t1COPY
22.22s
$sw=[System.Diagnostics.Stopwatch]::new()
$sw.Start()
$max=100000000
[object]$arr=1..$max
$t1=$sw.Elapsed.TotalSeconds.ToString('0.00s')
$sw.Stop()
$t1COPY
17.42s

这边按照vba一样的逻辑测试时间实在是超的太多了吧?(1亿测试)
Object与Object[]的时间也是不一样的
$sw=[System.Diagnostics.Stopwatch]::new()
$sw.Start()
$max=100000000
[int[]]$arr=1..$max
$t1=$sw.Elapsed.TotalSeconds.ToString('0.00s')
$sw.Stop()
$t1COPY
43.58s

不懂为什么改int[]时间直接成倍上涨,2倍多了

TOP

本帖最后由 bylove 于 2023-9-14 17:30 编辑
$sw=[System.Diagnostics.Stopwatch]::new()
$sw.Start()
$max=100000000
[System.Collections.Generic.List[int]]$arr=1..$max
$t1=$sw.Elapsed.TotalSeconds.ToString('0.00s')
$sw.Stop()
$t1COPY
用List速度会变快我可以理解,但List[int]一样也慢.

换Object试试
$sw.Start()
$max=100000000
[System.Collections.Generic.List[object]]$arr=1..$max
$t1=$sw.Elapsed.TotalSeconds.ToString('0.00s')
$sw.Stop()
$t1COPY
10.52s

这么看来根据上面测试汇总一下:

Object与List[Object] 17.42s, 10.52s

int与int[] 43.58s, 32.73s

TOP

字符串数值跟二进制数值???
范围类型跟基础类型???

TOP

回复 2# bylove


    vba里的字典,keys10万和100万的耗时相差非常多,而且key用字符串比用数字快很多,请问大概是什么原因,多谢

TOP

本帖最后由 bylove 于 2023-9-14 18:07 编辑

VB.net
    Sub Main()
        Dim t# = 0, max = 100000000, arr%()
        ReDim arr%(max)
        For j% = 1 To 5
            t = Environment.TickCount
            For i% = 0 To max - 1
                arr(i) = i
            Next
            Console.WriteLine(((Environment.TickCount - t) / 1000).ToString("0.00s"))
        Next
        Console.ReadKey(1)
    End SubCOPY

0.52s
0.41s
0.31s
0.30s
0.33s


C#
        static void Main(string[] args)
        {
            int max = 100000000;
            int[] arr = new int[max];
            for (int j = 0; j < 5; j++)
            {
                double t = Environment.TickCount;
                for (int i = 0; i < max; i++)
                {
                    arr[i] = i;
                }
                Console.WriteLine(((Environment.TickCount - t) / 1000).ToString("0.00s"));
            }
            Console.ReadKey(true);
        }COPY
0.44s
0.31s
0.34s
0.36s
0.27s

PowerShell和c#从时间上来看差异也不大啊都是net上的方法

只能解释可能是由于PowerShell是解释型语言所以速度比vba还要慢了吧?

但是慢的也太多了吧?

这个就不谈了,怎么解释Object速度比int快呢?不应该是反过来吗?

TOP

回复 7# bylove


    试了一下(1..10)的类型是Object[],可能是int[]需要转换类型吧
还有就是上面的问题,vba里的字典,10万个key1秒,100万个key需要70秒,还有字符串key比longkey快很多,真的懵b。。。

TOP

回复 6# wanghan519


    vba的字典和net的字典好像根本比不了,如果处理数据量非常大的话,速度可能还没PowerShell脚本快(应该)
    net的字典查询添加速度都比vba快,原因我就不清楚了

    整数好像是要比字符串慢的,可能是字符串的字数少?

TOP

回复 7# bylove


    还有就是powershell调用函数好慢,同样的递归c#里0.2秒,powershell里100秒...

TOP

本帖最后由 bylove 于 2023-9-14 18:24 编辑

回复 10# wanghan519


    我觉得会不会是因为你类型声明不对啊?试试优化一下,这个问题我也解释不了,感觉原先vba里的概念带入到PowerShell里就感觉PowerShell慢的跟蜗牛一样.而且经过测试vba的速度和c#比还算正常 甚至速度比c#还快上一点点.
当然这只是逻辑很简单的测试,我相信逻辑复杂的测试vba速度肯定不如c#

另外有的时候又觉得vba速度不如PowerShell,感觉用工具的时候就很混乱,不知道应该用哪一个

唯一能解释PowerShell速度能比vba快的原因是PowerShell调用了net的方法,如果用PowerShell自带的函数可能也会快,但手动撸的自定义函数如果优化的不好,很可能没vba的快

TOP

回复 8# wanghan519


    还有添加字典速度本来就很慢啊,添加字典尽量用add 不要用obj(xx)=xx 这种效率极其的慢,如果你都这么做了还慢那就不好说了,我也不清楚,哈哈

TOP

回复 10# wanghan519


    我刚用c#测试了一下int[]和Object[] 换成Object[]后时间感觉已经超过10秒以上了,我直接停止调试了,但是int[]测试还是0.5s  测试循环是1亿

所以我没有怀疑错,Object类型就是会比int慢的

但是不懂为什么PowerShell里是反过来的.晕了我

TOP

回复 13# bylove


    因为c#里是直接用int数据往里填,powershell里你的写法是1..100,但这东西是object[]类型的。。。

TOP

本帖最后由 bylove 于 2023-9-14 19:26 编辑

回复 14# wanghan519


    可是PowerShell里你写1..100速度就是比for($i=0;$i -lt 100;$i++) 快啊,怎么解释?

想变快貌似只能用Linq了:
$t=[System.Environment]::TickCount
[object]$x=[System.Linq.Enumerable]::Range(1,100000000)
(([System.Environment]::TickCount-$t)/1000).ToString('0.00s')COPY

TOP

返回列表