Что так долго занимает IsNumeric () в .NET? - PullRequest
2 голосов
/ 16 февраля 2009

Сегодня проводил сравнительный анализ с 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

Я был очень удивлен результатом. С числовым значением это было примерно в 8-10 раз быстрее, чем обычный IsNumeric (), а с пустым или не числовым значением оно было в 1000-1500 раз быстрее.

Что так долго принимает IsNumeric? Что-то еще происходит под капотом, что я должен рассмотреть, прежде чем заменить его на функцию выше? Я использую IsNumeric примерно в 50 разных местах по всему сайту, в основном для проверки форм и строк запросов.

Ответы [ 4 ]

15 голосов
/ 16 февраля 2009

Где вы проверяете разделители и знаки после запятой? Отрицание? Экспоненциальная запись?

Видите ли, ваша функция является лишь небольшим подмножеством числовых строк.

1,000,000.00
1,5E59
-123456789

Вам не хватает всего этого.

0 голосов
/ 17 февраля 2009

Я бы использовал

Integer.TryParse()
или
Double.TryParse()
в зависимости от того, какой тип данных вы используете, поскольку оба эти параметра учитывают региональные различия.
0 голосов
/ 16 февраля 2009

Вообще говоря, я бы не стал дублировать или заменять языковые функции, подобные этой, особенно на языке, подобном VB, который обязательно будет реализовывать множество вариантов использования для вас. По крайней мере, я бы назвал ваш метод чем-то особенным, чтобы он не смущал других разработчиков.

Разница в скорости связана с тем, что ваш код выполняет намного меньше работы, чем функция языка VB.

0 голосов
/ 16 февраля 2009

Один символ может содержать только 0, 1, 2, 3, 4, 5, 6, 7, 8, 9

, но полная строка может содержать любое из следующего:

1
1234
12.34
-1234
-12.34
0001

поэтому IsNumeric должно быть несколько медленнее.

Есть также проблемы культуры и интернационализации. т.е. если вы обрабатываете строку Unicode, IsNumeric также обрабатывает числа из всех других языков?

...