代码之家  ›  专栏  ›  技术社区  ›  moster67

VB.NET-测试空字符串时的性能

  •  3
  • moster67  · 技术社区  · 17 年前

    在VB6中,有人告诉我,在测试空字符串时,通过使用以下命令验证字符串的长度来检查它会快得多:

    If Len("ABC") = 0 then 'fast
    

    If LenB("ABC") = 0 then 'even faster
    

    而不是:

    If "ABC" = "" then 'slower
    

    你知道这在VB.NET中是否也是真的吗? 非常感谢。

    4 回复  |  直到 16 年前
        1
  •  10
  •   dplante Tschallacka    14 年前

    我并不完全了解VB的语法,但在C#中,你可以使用String静态方法 IsNullOrEmpty :

    String.IsNullOrEmpty("ABC")
    

    调试此方法时,它将检查。参数的长度。检查长度总是更快,因为在字符串比较时,编译器必须创建一个新的对象进行比较(在这种情况下是“ABC”字符串)。

        2
  •  5
  •   U62    17 年前

    没必要,不,我的意思是,你在开玩笑吗?有多少人编写程序,比较字符串是否为零长度,对性能有任何影响。即使字符串没有保留长度计数,VB每次都会进行c风格的strcmp()字符串比较,字符串比较函数也不会花很长时间来计算出其中一个字符串的长度为零,对吧?但是。NET字符串确实包含一个长度字段,因此当您进行字符串比较时,它要检查的第一件事是长度是否不同,即直接进行int比较。如果函数调用,并且只有JIT内联了Len(),你自己做这件事才能节省所有成本。

    顺便说一句,在VB.NET中,你不需要调用String.IsNullOrEmpty(),因为字符串之间的比较被转换为对String.strcmp()的调用,该调用将null(VB中的Nothing)转换为对String.EmptyString的引用。然后,它继续调用Reflector无法检查的本机函数,但我非常确定它做的第一件事是检查字符串的长度是否不同。

        3
  •  1
  •   Tom Anderson    17 年前

    您应该使用:

    If ("Value").Length > 0 Then
    
    End If
    
        4
  •  0
  •   Av Av    17 年前

    我认为VB6等效于IsNullOrEmpty的最佳解决方案是

    Public Function IsNullOrEmpty(ByRef s As Variant) As Boolean
    
      If IsNull(s) Then ' IsNull returns true if s is a Variant that is Null
        IsNullOrEmpty = True ' IsNull returns false if s is a Variant and s = vbEmpty
        Exit Function
      End If
    
      If LenB(s) = 0 Then ' never compare a string to "" - it's slow
        IsNullOrEmpty = True
        Exit Function
      End If
    
      If LenB(Trim(s)) = 0 Then
        IsNullOrEmpty = True
        Exit Function
      End If
    
      IsNullOrEmpty = False
    
    End Function
    

    具有讽刺意味的是,如果你有设置为vbEmpty的字符串或变量,那么这个函数将返回false,因为vbEmpty作为字符串是“0”。因此,如果你不小心使用这个版本,你可能会遇到一些奇怪的错误。