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

3
在VB6中,当检测空字符串时,据说通过使用以下方法验证字符串的长度会更快:
If Len("ABC") = 0 then 'fast

或者

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

替代:

If "ABC" = "" then 'slower

你知道在VB.NET中是否也是这样吗?谢谢。
4个回答

11

我不太清楚VB的语法,但在C#中,你可以使用String静态方法 IsNullOrEmpty

String.IsNullOrEmpty("ABC")

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


你是说 IsNullOrEmpty 比 .length 更快吗? - Tom Anderson
1
不,如果你调试这个函数,你会发现.NET Framework使用.length而不是与空字符串比较。 - robertpnl
2
它是否使用长度并不重要:微软可能会在未来的补丁中更改该实现。更重要的是,这是进行测试的“正确”方法。它可能偶尔会慢一点,但我真的怀疑空字符串检查是否会成为您应用程序的瓶颈。 - Joel Coehoorn
假设字符串为空 - 只检查长度会抛出异常吗?如果是这样,我想使用 "String.IsNullOrEmpty" 可能更安全。 - moster67
在 str 为 Nothing 的情况下执行 str.Length 将会抛出错误。IsNullOrEmpty 函数是正确的做法。 - Bryan Anderson
2
速度问题远远被可读性所超越。这些类型的优化是浪费时间的罕见例外。即使有一种方法碰巧稍微快一点,那也可能会在将来的编译器版本中发生改变。这不是编译器和开发者之间的契约的一部分。 - JohnFx

5
并不是必需的,我的意思是你在开玩笑吗?有多少人编写程序,在比较字符串是否为空时会对性能产生任何影响。即使字符串不保留长度计数,VB每次执行c-style strcmp()字符串比较,也不需要很长时间来确定其中一个字符串的长度是否为零,不是吗?但.NET字符串确实包括一个长度字段,因此当您进行字符串比较时,它将首先检查长度是否不同,即进行直接的int比较。如果JIT内联了Len(),您自己完成这个操作能节省的只有一个函数调用。
顺便说一句,在VB.NET中,您不需要调用String.IsNullOrEmpty(),因为字符串之间的比较会被转换为对String.strcmp()的调用,该函数将null(在VB中是Nothing)转换为对String.EmptyString的引用。然后,它继续调用一个无法由反汇编工具Reflector检查的本地函数,但我非常确定它要做的第一件事情是检查字符串的长度是否不同。

我同意你的观点。这种过早的优化是愚蠢的。除非你在运行一个需要对空字符串进行数百万次检查的极端时间关键型应用程序,否则我甚至不会考虑这样做。即使在这种情况下,也值得怀疑。 - JohnFx

1

你应该使用:

If ("Value").Length > 0 Then

End If

0

我认为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”。因此,如果您在使用此版本时不小心,可能会出现一些奇怪的错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接