【问题标题】:VB.NET- Peformance when testing an empty stringVB.NET- 测试空字符串时的性能
【发布时间】:2009-01-06 13:12:59
【问题描述】:

在 VB6 中,有人告诉我,在测试空字符串时,使用以下方法验证字符串的长度会更快:

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

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

代替:

If "ABC" = "" then 'slower

您是否知道这在 VB.NET 中是否也是如此? 谢谢。

【问题讨论】:

    标签: .net vb.net string vb6


    【解决方案1】:

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

    String.IsNullOrEmpty("ABC")
    

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

    【讨论】:

    • 你是说 IsNullOrEmpty 比 .length 快吗?
    • 没有。如果您正在调试此函数,您将看到 .NET Framework 使用 .length 而不是与空字符串进行比较。
    • 它是否使用长度并不重要:MS 可能会在未来的补丁中更改该实现。更重要的是,这是进行测试的正确方法。它有时可能会慢一点,但我严重怀疑空字符串检查是您应用程序的瓶颈。
    • 假设字符串为空 - 是否只检查长度然后抛出异常?如果是这样,我想使用“String.IsNullOrEmpty”可能更安全
    • 可读性大大超过了速度问题。这些类型的优化是浪费时间的罕见例外。即使一种方法确实稍微快了一点,在未来的编译器版本中也会发生变化。这不是编译器和开发人员之间合同的一部分。
    【解决方案2】:

    没必要,我的意思是你在开玩笑吗?有多少人编写程序来比较字符串以查看它是否为零长度对性能有任何影响。即使字符串没有保留长度计数并且 VB 每次都进行 c 样式的 strcmp() 字符串比较,字符串比较函数也不需要很长时间才能确定其中一个字符串的长度为零,对吗?但是 .NET 字符串确实包含一个长度字段,因此当您进行字符串比较时,首先要检查的是长度是否不同,即直接 int 比较。如果是函数调用并且仅当 JIT 内联 Len() 时,您自己执行此操作即可节省所有费用。

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

    【讨论】:

    • 我和你在一起。这些类型的过早优化是愚蠢的。我什至不会考虑做这样的事情,除非你在一个运行空字符串检查数百万次的极其时间关键的应用程序中。即使这样也是有问题的。
    【解决方案3】:

    你应该使用:

    If ("Value").Length > 0 Then
    
    End If
    

    【讨论】:

      【解决方案4】:

      我认为等效于 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”。所以如果你不小心使用这个版本,你可能会得到一些奇怪的错误。

      【讨论】:

        猜你喜欢
        • 2011-03-09
        • 1970-01-01
        • 1970-01-01
        • 2018-08-10
        • 2014-07-09
        • 2011-09-21
        • 2011-10-14
        • 2012-06-12
        • 2020-06-10
        相关资源
        最近更新 更多