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

时间:2009-01-06 13:12:59

标签: .net vb.net string vb6

在VB6中,我被告知在测试空字符串时,通过使用以下方法验证字符串的长度来检查它会快得多:

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

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

而不是:

If "ABC" = "" then 'slower

你知道VB.NET中是否也是这样吗? 谢谢。

4 个答案:

答案 0 :(得分:9)

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

String.IsNullOrEmpty("ABC")

当您调试此方法时,它将检查参数的.Length。检查长度总是更快,因为在String比较中,编译器必须创建一个要比较的新对象(在本例中为“ABC”字符串)。

答案 1 :(得分:6)

没有必要不,我的意思是你在开玩笑吧?有多少人编写程序来比较一个字符串,看它是否为零长度对性能有任何影响。即使字符串没有保留长度计数并且VB每次都进行了c样式的strcmp()字符串比较,它也不会花费很长的字符串比较函数来计算出其中一个字符串是零长度吗?但.NET字符串确实包含一个长度字段,所以当你进行字符串比较时,首先要检查的是长度是否不同,即直接比较。如果是函数调用,那么你自己保存所有这些,然后只有JIT内联Len()。

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

答案 2 :(得分:1)

您应该使用:

If ("Value").Length > 0 Then

End If

答案 3 :(得分:0)

我认为相当于IsNullOrEmpty的VB6的最佳解决方案是

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”。因此,如果你不小心使用这个版本,你可能会遇到一些奇怪的错误。