2

今日 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 を使用していますが、主にフォームとクエリ文字列の検証に使用しています。

4

4 に答える 4

16

ロケール固有の区切り文字と小数点以下の桁数のチェックはどこにありますか? 否定?指数表記?

ご覧のとおり、関数は数値文字列のごく一部にすぎません。

1,000,000.00
1,5E59
-123456789

あなたはこれらすべてを見逃しています。

于 2009-02-16T18:20:12.690 に答える
0

1 つの文字には、0、1、2、3、4、5、6、7、8、9 のみを含めることができます

ただし、完全な文字列には次のいずれかが含まれる場合があります。

1
1234
12.34
-1234
-12.34
0001

そのため、IsNumeric はやや遅くなるはずです。

文化や国際化の問題もあります。つまり、Unicode 文字列を処理している場合、IsNumeric は他のすべての言語の数値も処理しますか?

于 2009-02-16T18:21:26.260 に答える
0

一般的に言えば、特に VB のような言語では、多くのユース ケースを実装する必要があるため、このような言語機能を複製したり置き換えたりすることは避けます。少なくとも、他の開発者が混乱しないように、独自のメソッドに名前を付けます。

速度の違いは、コードが VB 言語機能よりもはるかに少ない作業を行っているという事実によるものです。

于 2009-02-16T18:35:32.450 に答える