Magnus Engdal
Magnus Engdal

Reputation: 5634

What is taking IsNumeric() so long in .NET?

Was doing some benchmarking with IsNumeric today and compared it to the following function:

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

I was pretty surprised with the result. With a numeric value this one was about 8-10 times faster then regular IsNumeric(), and with an empty or non-numeric value it was 1000-1500 times faster.

What is taking IsNumeric so long? Is there something else going on under the hood that I should consider before replacing it with the function above? I use IsNumeric in about 50 different places all over my site, mostly for validation of forms and query strings.

Upvotes: 2

Views: 2793

Answers (4)

user65628
user65628

Reputation:

I would use

Integer.TryParse()
or
Double.TryParse()
depending on the data type you are using, since both of these account for regional differences.

Upvotes: 0

Generally speaking, I would avoid duplicating or replacing language features like this, especially in a language like VB, which is bound to be implementing many use cases for you. At the very least, I would name your method something distinct so that it is not confusing to other developers.

The speed difference is bound to be the fact your code is doing far less work than the VB language feature is.

Upvotes: 0

chakrit
chakrit

Reputation: 61518

A single char can only contains 0, 1, 2, 3, 4, 5, 6, 7, 8, 9

but a full string may contains any of the following:

1
1234
12.34
-1234
-12.34
0001

so IsNumeric ought to be somewhat slower.

There're also cultural and internationalization issues. i.e. If you are processing a Unicode string, does IsNumeric also process numbers from all other languages as well?

Upvotes: 0

Welbog
Welbog

Reputation: 60438

Where is your check for locale-specific delimiters and decimal places? Negation? Exponential notation?

You see, your function is only a tiny subset of what numeric strings can be.

1,000,000.00
1,5E59
-123456789

You're missing all of these.

Upvotes: 16

Related Questions