游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4565|回复: 11

探讨VB循环的效率问题

[复制链接]

29

主题

475

帖子

483

积分

中级会员

Rank: 3Rank: 3

积分
483
发表于 2008-7-29 22:46:00 | 显示全部楼层 |阅读模式
在这里,探讨VB的循环效率问题,探讨的循环有For循环,For Each循环和Enumerator接口循环

----------------------------------------------------------------

硬件环境:
CPU:AMD Athlon X2 3600+
内存:DDR2 667 512M * 2
芯片组:nForce 650
硬盘:SATA2
分辨率:1280*1024*32bit

----------------------------------------------------------------

软件环境:
Microsoft Windows XP x86 SP2
Microsoft .NET Framework 1.1
Microsoft Visual Studio .NET 2003

----------------------------------------------------------------

测试内容:
分别探讨For循环、For Each循环和Enumerator接口循环在数组(Array)和集合(ArrayList)中遍历的效率问题,为了减少误差,数组和集合中的元素各种都为500000,从元素0遍历到元素499999。程序采用控制台模式,运行时关闭所有可关闭后台程序,包括杀毒软件,监控软件和更新软件。程序使用线程计时,精确到1秒,最后得出时间少者为效率高。

----------------------------------------------------------------

前期工作:
首先,声明并初始化数组(al)和集合(a):
        Dim a(49999) As String
        For i As Integer = 0 To 49999
            a(i) = i.ToString
        Next

        Dim al As New ArrayList
        For i As Integer = 0 To 49999
            al.Add(i.ToString)
        Next

声明线程(th)及其线程体和计数变量(t):
    Dim t As Single

    Sub timer()
        While True
            t += 1.0F
            Threading.Thread.Sleep(1000)
        End While
    End Sub

    Dim th As New Threading.Thread(AddressOf timer)

----------------------------------------------------------------

正式代码:
        'For循环对数组
        t = 0
        th.Start()
        For i As Integer = 0 To 499999
            Console.WriteLine(i)
        Next
        th.Suspend()
        MsgBox(t)

        'For Each循环对数组
        t = 0
        th.Resume()
        For Each i As String In a
            Console.WriteLine(i)
        Next
        th.Suspend()
        MsgBox(t)

        'Enumerator循环对数组
        t = 0
        Dim e1 As IEnumerator = a.GetEnumerator
        e1.Reset()
        th.Resume()
        While e1.MoveNext
            Console.WriteLine(e1.Current)
        End While
        th.Suspend()
        MsgBox(t)

        'For循环对集合
        t = 0
        th.Resume()
        For i As Integer = 0 To 499999
            Console.WriteLine(al.Item(i))
        Next
        th.Suspend()
        MsgBox(t)

        'For Each循环对集合
        t = 0
        th.Resume()
        For Each i As String In al
            Console.WriteLine(i)
        Next
        th.Suspend()
        MsgBox(t)

        'Enumerator循环对集合
        t = 0
        Dim e2 As IEnumerator = al.GetEnumerator
        e2.Reset()
        th.Resume()
        While e2.MoveNext
            Console.WriteLine(e2.Current)
        End While
        th.Suspend()
        MsgBox(t)

----------------------------------------------------------------

运行结果:
For循环对数组:25秒
For Each循环对数组:17秒
Enumerator循环对数组:17秒
For循环对集合:17秒
For Each循环对集合:18秒
Enumerator循环对集合:18秒
注,测试顺序更换后结果依然相同。

----------------------------------------------------------------

结论:
1、For循环更加适合集合遍历,而For Each适合循环遍历;
2、Enumerator的效率与For Each相近,微软也曾说明过,For Each就是Enumerator的简化版,也可以由此证明

这个实验却推翻了这个一些本来想当然的事情,虽然在我们印象中,For Each似乎更加适合集合,而For循环适合数组,但结论与想法彻底颠覆。不管怎么说,凡是不能靠自己想当然的就决定了,应该多做实验,多亲自去体验,才会知道事情的真相,才会更加接近真理。

PS:版主啊,写得好辛苦啊,可以锁页推到首页去吗?

11

主题

747

帖子

752

积分

高级会员

Rank: 4

积分
752
发表于 2008-7-29 23:08:00 | 显示全部楼层

Re:探讨VB循环的效率问题

难得技术贴,不顶枉为好人

7

主题

318

帖子

318

积分

中级会员

Rank: 3Rank: 3

积分
318
发表于 2008-7-30 07:15:00 | 显示全部楼层

Re:探讨VB循环的效率问题

真有心

15

主题

2093

帖子

2093

积分

金牌会员

Rank: 6Rank: 6

积分
2093
发表于 2008-7-30 10:23:00 | 显示全部楼层

Re:探讨VB循环的效率问题

完全不懂……

0

主题

7

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2008-7-30 11:45:00 | 显示全部楼层

Re:探讨VB循环的效率问题

那以后普通数组循环还用不用for了?从0-100循环每次会比foreach慢多少?
另外lz测过loop的效率没有?

0

主题

22

帖子

22

积分

注册会员

Rank: 2

积分
22
发表于 2008-7-30 18:29:00 | 显示全部楼层

Re:探讨VB循环的效率问题

do loop?测过了没?

29

主题

475

帖子

483

积分

中级会员

Rank: 3Rank: 3

积分
483
 楼主| 发表于 2008-7-30 18:46:00 | 显示全部楼层

Re: Re:探讨VB循环的效率问题

我是一个玩家3: Re:探讨VB循环的效率问题

do loop?测过了没?


呵呵,主要是测试不同三个方向的循环,do loop实际上与for循环是同一类型的

11

主题

747

帖子

752

积分

高级会员

Rank: 4

积分
752
发表于 2008-7-30 20:31:00 | 显示全部楼层

Re:探讨VB循环的效率问题

for 要比 do loop 有效率

29

主题

475

帖子

483

积分

中级会员

Rank: 3Rank: 3

积分
483
 楼主| 发表于 2008-7-31 17:13:00 | 显示全部楼层

Re: Re:探讨VB循环的效率问题

jnmao: Re:探讨VB循环的效率问题

for 要比 do loop 有效率


呵呵,可能是我疏漏了吧

11

主题

747

帖子

752

积分

高级会员

Rank: 4

积分
752
发表于 2008-7-31 17:26:00 | 显示全部楼层

Re: Re: Re:探讨VB循环的效率问题

大元帅: Re: Re:探讨VB循环的效率问题



呵呵,可能是我疏漏了吧

我没实验过,一篇《提高VB效率》的文章里写的,你测试过,所以应该以你的数据为准。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-21 00:53

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表