【问题标题】:What is taking IsNumeric() so long in .NET?是什么让 IsNumeric() 在 .NET 中花费了这么长时间?
【发布时间】:2010-10-07 22:23:05
【问题描述】:

今天正在使用 IsNumeric 进行一些基准测试,并将其与以下函数进行比较:

Private Function IsNumeric(ByVal str As String) As Boolean
    If String.IsNullOrEmpty(Str) Then Return False
    Dim c As Char

    For i As Integer = 0 To Str.Length - 1
        c = Str(i)
        If Not Char.IsNumber(c) Then Return False
    Next

    Return True
End Function

我对结果感到非常惊讶。 使用数值时,它比常规 IsNumeric() 快 8-10 倍,使用空值或非数值时,它快 1000-1500 倍。

什么是 IsNumeric 这么长时间?在用上面的函数替换它之前,我还应该考虑其他事情吗? 我在整个网站的大约 50 个不同的地方使用 IsNumeric,主要用于验证表单和查询字符串。

【问题讨论】:

  • 或者如果它是一个负数或像 3.1415926526e0 这样的指数
  • 性能重要吗?您是否处于 IsNumeric() 中花费了总执行时间的一小部分的情况?
  • 可能不是没有,只是好奇,得到了很多好的答案

标签: vb.net performance isnumeric


【解决方案1】:

您在哪里检查特定于语言环境的分隔符和小数位?否定?指数符号?

你看,你的函数只是数字字符串的一小部分。

1,000,000.00
1,5E59
-123456789

你错过了所有这些。

【讨论】:

  • 是的,也许我应该更好地解释我的情况,如果我对 0-9 和也许 感到满意,而且 - 而且,它仍然快了很多,更多的是一个问题,为什么 IsNumeric() 如此不合理慢。如果有更多的东西。但也许不是:)
  • 为了获得更好的结果,请尝试将其与 Double.TryParse() 进行比较
  • 如果只调用整数,则为 Int32.TryParse。
  • @Cyrodor:IsNumeric() 考虑了所有语言环境,所有表示数字的方式,其中一些可能非常复杂。解析字符串并没有你想象的那么简单。
  • 知道了,但我发现真正奇怪的一件事是解析空字符串“”也花费了大约 1500 倍的时间。所以我认为还有其他一些功能正在运行。
【解决方案2】:

单个字符只能包含 0、1、2、3、4、5、6、7、8、9

但完整的字符串可能包含以下任何内容:

1
1234
12.34
-1234
-12.34
0001

所以 IsNumeric 应该会慢一些。

还有文化和国际化问题。即,如果您正在处理 Unicode 字符串,IsNumeric 是否也处理所有其他语言的数字?

【讨论】:

    【解决方案3】:

    一般来说,我会避免重复或替换这样的语言功能,尤其是像 VB 这样的语言,它必然会为您实现许多用例。至少,我会将您的方法命名为不同的名称,以免其他开发人员感到困惑。

    速度差异必然是因为您的代码所做的工作远远少于 VB 语言功能。

    【讨论】:

    • 然而,在某些情况下,如果您知道您正在处理的具体数字类型是什么,那么滚动您自己的函数是更好的选择。即,如果我知道我将处理原始整数/长数字,0 到 9,而不是货币、浮点数、指数等,那么如果我可以缩小范围,为什么要浪费循环让函数检查所有可能的事情?
    • 当然,程序员的个人工具箱胜过一切。
    【解决方案4】:

    我会用

    Integer.TryParse()
    Double.TryParse()
    取决于您使用的数据类型,因为这两者都考虑了区域差异。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-15
      • 2016-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多