值类型装箱引发的效率问题(vb.net)

来源:互联网 发布:网络大电影广告植入 编辑:程序博客网 时间:2024/04/30 23:07

CLR支持2种类型:引用类型和值类型。
任何被称为“类”的类型,都是引用类型,例如System.Object,System.IO.FileStream,System.String等
 
值类型是比引用类型更为轻量级的类型,比如:Dim i as Int32=2,这个就是一个值类型变量
一般情况,值类型的使用,要比引用类型快很多,但很多情况下,值类型往往要被转换成一个引用类型来使用,这个过程被成为装箱。
比如:
        Dim j As Int32 = 1
        Dim obj As Object = j
        Dim str As String
        '需要进行一次装箱(值类型转换成System.String对象)
        str = j
进行装箱要增加更多的IL代码,假如放在循环中的话,将降低程序的效率。
我做了两个试验进行了一下对比。
第一种:
Module Module1

    Sub Main()
        Console.WriteLine(System.DateTime.Now)
        Dim intTmp As Int32 = 1
        '需要进行一次装箱(值类型转换成System.String对象)
        Dim strTmp As String = intTmp.ToString
        Dim str As String
        Dim i As Int32

        For i = 0 To 30000000
            '需要进行2次装箱(值类型转换成System.String对象)
            str = "1" & intTmp
            str = "2" & intTmp
        Next

        Console.WriteLine(System.DateTime.Now)

    End Sub

End Module
结果:
2006-3-13 21:18:54

2006-3-13 21:19:18
用了24秒
第二种:
Module Module1

    Sub Main()
        Console.WriteLine(System.DateTime.Now)
        Dim intTmp As Int32 = 1
        '需要进行一次装箱(值类型转换成System.String对象)
        Dim strTmp As String = intTmp.ToString
        Dim str As String
        Dim i As Int32

        For i = 0 To 30000000
            '不需要装箱操作
            str = "1" & strTmp
            str = "2" & strTmp
        Next

        Console.WriteLine(System.DateTime.Now)

    End Sub

End Module

 

结果:

2006-3-13 21:20:42

2006-3-13 21:20:48

用了6秒
 
所以为了写出更好的代码,对于装箱拆箱也要注意