记得在Framework 2.0还叫1.2的时候,我曾经进行过几个简单的实验,以便测试对带有约束的泛型类中,类型参数对象的方法调用的性能。其结果令我非常失望——类型参数对象的方法调用比用接口调用甚至通过Object传递的方式都慢得多,泛型的优势完全没有体现出来。到了BETA1,我又可以重复这个简单的实验,结果却大大不同了。这是我的四个实验方法:

Private Sub Test1(Of T As ITest)(ByVal obj As T)
    obj.Test()
End Sub

Private Sub Test2(ByVal obj As ITest)
    obj.Test()
End Sub

Private Sub Test3(ByVal obj As Object)
    DirectCast(obj, TTest).Test()
End Sub

Private Sub Test4(ByVal obj As TTest)
    obj.Test()
End Sub

其中用到的结构及接口定义如下:

Private Interface ITest
    Sub Test()
End Interface

Private Structure TTest
    Implements ITest

    Public i As Integer

    Public Sub Test() Implements ITest.Test
        'no code
    End Sub
End Structure

很简单,第一个方法用了约束ITest的类型参数T作为参数;第二个是用ITest接口作为类型参数;第三个方法则是用Object作为参数,并在调用前直接拆箱;第四个直接用结构作为类型参数,想象中应该是它最快……测试用的代码已经是老生常谈了:

Dim w As New Stopwatch

'Static 让所有测试共享一个预先创建结构的实例

Static testObj As New TTest

w.Start()
For iLoop As Integer = 0 To 10000000

    Test1(testObj) 'Or Test2, Test3, etc

Next
w.Stop()

TextBox1.AppendText(w.ElapsedMilliseconds & vbCrLf)

结果为Release下,不开特殊优化,预运行10次得到的(毫秒):

泛型:208
接口:394
Object:329
直接结构:209

我也很震惊,早先性能很差的泛型版本竟然超过了直接结构调用!而接口参数的速度反而成了最慢。我对这几个月来,.NET Framework组在泛型性能上的工作十分满意,但愿在正式版还有上佳表现。