关于性能:VB.NET中的ElseIf或Case语句

ElseIf or Case Statement in VB.NET

当使用Case而不是ElseIf链时,是否有一般的性能指南?

请考虑以下示例…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
        Dim lobjExample As Object = GetARandomDataTypeCrapExample()
        If lobjExample Is GetType(Boolean) Then
            ' Solve world hunger here
        ElseIf lobjExample Is GetType(Byte) Then
            ' Solve world hunger here
        ElseIf lobjExample Is GetType(Char) Then
            ' Solve world hunger here
        ElseIf lobjExample Is GetType(Date) Then
            ' Solve world hunger here
        ElseIf lobjExample Is GetType(Decimal) Then
            ' Solve world hunger here
        ElseIf lobjExample Is GetType(String) Then
            ' Solve world hunger here
        ElseIf lobjExample Is GetType(Integer) Then
            ' Solve world hunger here
        ElseIf lobjExample Is GetType(Double) Then
            ' Solve world hunger here
        ElseIf lobjExample Is GetType(Long) Then
            ' Solve world hunger here
        ElseIf lobjExample Is GetType(SByte) Then
            ' Solve world hunger here
        ElseIf lobjExample Is GetType(Short) Then
            ' Solve world hunger here
        ElseIf lobjExample Is GetType(Single) Then
            ' Solve world hunger here
        ElseIf lobjExample Is GetType(ULong) Then
            ' Solve world hunger here
        ElseIf lobjExample Is GetType(UInteger) Then
            ' Solve world hunger here
        ElseIf lobjExample Is GetType(UShort) Then
            ' Solve world hunger here
        Else
            ' Cannot solve world hunger
        End If

这是否更适合作为案例陈述?


vb.net select case语句非常灵活。比等价的c switch关键字要多得多。这一切都是有意的,也是语言背后哲学的一部分。如果vb.net对程序员是友好的,那么c对机器是友好的。

.NET中间语言有一个专用的操作码来实现这类语句opcodes.switch。它将在运行时抖动到一个跳转表,非常快,如果跳转表是"完美的",所有插槽都已填满,则不需要if-then-else代码。

但是它有一个实际的限制,跳转表条目必须在编译时知道。如果您的case语句是常量表达式,那么它可以正常工作。C编译器在switch语句案例中允许的类型。但这不能是object.getType()的值,"type handle"是在运行时生成的,它的值将完全取决于之前所进行的抖动。

因此,vb.net编译器做了一件对程序员友好的事情,并将您的select case语句转换为if-then-else语句链。就像你亲手写的那样。使用ildasm.exe工具自己查看。

所以别拘束你的风格,这没什么区别。唯一你想知道的是,一个查阅表格是否能使它更快。一个Dictionary(Of Type, Integer),现在您的select case语句将非常快,因为它可以使用优化版本。但字典的附加费用。只有你有足够的兴趣去检查它。使用真实数据是非常重要的,合成测试往往不能正确地测试所需的if-then测试的数量。案例陈述的顺序非常重要,最有可能的匹配应该在顶部。

也许值得注意的是即将到来的精选案例类型的语句。它只是语法上的甜言蜜语,而不是性能。