Sugi@ぱぱんぶぃびぃ Blog

VBとかVB.NETとかVB2005とか・・・

AILight Banner
AILight Blog

プロフィール

Sugi@ぱぱんぶぃびぃ Blog

目次

Blog 利用状況

記事分類

過去の記事

タグ

VB.NET の IsDate 関数が遅い理由

Public Shared Function IsDate(ByVal Expression As Object) As Boolean

調べてみると、引数で渡された値(Expression)を内部で DateTimeクラスのParseメソッドで変換を試みて、失敗したらFalseを返しているだけなんですね。(-_-;
変換前にもほんのわずかなチェックロジックはあるものの...。
で、オリジナルのIsDate関数を簡単に書いてみると、多分こんな感じ。

Public Shared Function IsDate(ByVal Expression As Object) As Boolean
  Dim dtm As DateTime
  If IsNothing(Expression) Then
    Return False
  End If
  If TypeOf Expression Is DateTime Then
    Return True
  End If
  If TypeOf Expression Is String Then
    Try
      dtm = DateTime.Parse(CType(Expression, String))
      Return True
    Catch ex As Exception

    End Try
  End If
  Return False
End Function

う~ん、そりゃ遅いだろ(納得)。( ̄ヘ ̄メ

日付チェックは自前の関数を書くことにします。

投稿日時 : 2004年3月2日 19:43


コメントを追加

#  re: VB.NET の IsDate 関数が遅い! 2004年3月2日 20:07 Sugi@ぱぱんぶぃびぃ

で、代替のIsDate関数を作成してみました。
Public Function IsDate(ByVal YearPart As Object, ByVal MonthPart As Object, ByVal DayPart As Object) As Boolean

  If IsNumeric(YearPart) And IsNumeric(MonthPart) And IsNumeric(DayPart) Then
    If CInt(YearPart) > DateTime.MaxValue.Year OrElse _
      CInt(MonthPart) > DateTime.MaxValue.Month OrElse _
      CInt(DayPart) > DateTime.MaxValue.Day OrElse _
      CInt(YearPart) < DateTime.MinValue.Year OrElse _
      CInt(MonthPart) < DateTime.MinValue.Month OrElse _
      CInt(DayPart) < DateTime.MinValue.Day Then
      Return False
    Else
      Select Case CInt(MonthPart)
        Case 1, 3, 5, 7, 8, 10, 11, 12

        Case 4, 6, 9
          If CInt(DayPart) > 30 Then
            Return False
          End If
        Case 2
          If DateTime.IsLeapYear(CInt(YearPart)) Then
            If CInt(DayPart) > 29 Then
              Return False
            End If
          Else
            If CInt(DayPart) > 28 Then
              Return False
            End If
          End If
      End Select
    End If
    Return True
  End If

End Function

C#な人たちはどうしてるんでしょう?

#  re: VB.NET の IsDate 関数が遅い理由 2004年3月4日 8:17 渋木宏明(ひどり)

英語表記とかに対応できないので、ボク的には DateTime.Parse() に賛成です。
「例外を使っているから遅い」のは初回だけだったりはしませんか?
2回目以降も決して「速い」というレベルではありませんが、気になるほど遅くもないように思います。

#  re: VB.NET の IsDate 関数が遅い理由 2004年3月4日 10:11 Sugi@ぱぱんぶぃびぃ

はい、ご指摘通り遅いのは初回のみで、2回目以降は気になる遅さではないのは確認してます。

英語表記とかに対応できないというのも確かにありますね。
今回私のシステムではたまたまここが気になる場面であったという話で...。
(お客はそんな理由は聞いちゃくれません(T_T))

ケースバイケースって事で。

#  re: VB.NET の IsDate 関数が遅い理由 2004年3月4日 11:55 石野光仁

例外のお話。この辺ですよね。
http://www.ailight.jp/blog/ishino/archive/2003/10/17/465.aspx

#  re: VB.NET の IsDate 関数が遅い理由 2004年3月4日 12:46 Sugi@ぱぱんぶぃびぃ

お!既に同様の話はあがっていたんですね。
で、とりあえずの対処としては、
「起動したら一個スレッドを起動し、例外を挙げてcatchして捨ててみる...」
なんか、やだ。(^_^;

#  re: VB.NET の IsDate 関数が遅い理由 2004年3月4日 14:44 菊池

DateTimeFormatInfo.GetAllDateTimePatterns
 をして、帰って来た文字列パターンを元に正規表現のマッチパターンを起こして、正規表現でマッチしてみるって流れで例外を避けてみるって事をしてますね。

 基本的に static な操作なので、スタティックコンストラクタで行ってますので、例外同様、初回が遅いという罠w

#  re: VB.NET の IsDate 関数が遅い理由 2004年3月4日 14:46 菊池

> 基本的に static な操作なので、スタティックコンストラクタで行ってますので、例外同様、初回が遅いという罠w

補足

 正規表現パターンを作ってコンパイル済みな正規表現を作るまでですね、当然マッチは都度です。

#  re: VB.NET の IsDate 関数が遅い理由 2004年3月4日 22:48 渋木宏明(ひどり)

関連アセンブリがロード済みになればいいだけなら、冒頭で new Exception() してみるとか?

#  re: VB.NET の IsDate 関数が遅い理由 2004年3月5日 16:36 菊池

>関連アセンブリがロード済みになればいいだけなら、冒頭で new Exception() してみるとか?

 Exceptionはabstractだから作れないってそういう問題でなくて…
 投げなあかんと思った。

#  re: VB.NET の IsDate 関数が遅い理由 2004年4月22日 19:11 高井

この初回の例外が遅いって言う現象、IDEだけですよね。
ビルド後のEXEでは、気になるほど遅くはないと思うのですが・・・


#  [VB2005] VB2005 の IsDate 関数 2005年5月13日 14:45 Sugi@ぱぱんぶぃびぃ Blog

[VB2005] VB2005 の IsDate 関数

#  [VB2005] VB2005 の IsDate 関数 2005年5月13日 14:46 Sugi@ぱぱんぶぃびぃ Blog

[VB2005] VB2005 の IsDate 関数
タイトル
名前
URL
コメント