かきくけこうもりのよろず投資日記(旧サイト)
 
このサイトは移転しました。サイト右側のリンクから、新しいブログに移動できます。
 


CSngよりもValの方が滅茶苦茶速い件について

23日の日記で、文字列型のデータを数値型に変換する操作が遅いと書きましたが、劇的に速くなる解決策を見つけました。
今まで私は、
dim hoge as single=csng(文字列)
という風にして文字列型を数値に変換していたのですが、これを
dim hoge as single=csng(Val(文字列))
とすると、かなり速くなるようです。
試しに、以下のようなコードを実行してみました。

Dim i As Integer
Dim j As Single
Debug.Print("CSng(Str(i / 10)) Start " & Environment.TickCount.ToString)
For i = 0 To 100000
j = CSng(Str(i / 10))
Next
Debug.Print("CSng(Str(i / 10)) End " & Environment.TickCount.ToString)
Debug.Print("CSng(Val(Str(i / 10))) Start " & Environment.TickCount.ToString)
For i = 0 To 100000
j = CSng(Val(Str(i / 10)))
Next
Debug.Print("CSng(Val(Str(i / 10))) End " & Environment.TickCount.ToString)

すると、

CSng(Str(i / 10)) Start 24127673
CSng(Str(i / 10)) End 24131849
CSng(Val(Str(i / 10))) Start 24131859
CSng(Val(Str(i / 10))) End 24132110

と出力されます。
デバッグモードだから適正な測定結果ではありませんが、文字列型を直接CSngに変換する場合は約4.2秒、それに対して間にValを挟むと約0.25秒。実に16倍も違います。なんじゃこりゃああああ!!
CSngは様々な数値の表現型に対応できるような機能があって、その結果、文字列を直接CSngで変換しようとすると時間がかかる→ということは、実装が古くて単純な処理をするであろうValを間に挟み込めば速くなるのではないか?と勘を働かせたらうまくいきました。
なっちゃんのプログラミングTips 文字列から数値への変換によりますと、CSngは\記号やカンマを含んだ文字列にも対応できるようです。知らなかった。
多分こんなの.NET使ってる人たちにとっては常識なんだろうなあ……無知な部分があまりにも多すぎて遠回りしすぎてる_| ̄|○

      _   (⌒Y´ ̄ヽ  ∧_/( ̄))∧_∧
    γ´  `ヽ_`と.__   )( ゚ ∩( 《 (  ゚∀゚)  ゴロン
     )) ,、 , ) <、_,.ノ  ヽ、.__,ノ l  つ つ
    ((_/し∪V              ヽ.__ノ!__)) ゴロン
  ∧__∧     出してよ、ウワァァァン!!    ∧_∧
 (    )       ヽ(`Д´)ノ         ( ゚∀゚ ) アヒャ
 (    つ       (    )        (つ  と)
 ヽ___ノj        ∪∪         (⌒Y⌒)
    ∧__∧                 /´ ̄ヽ ̄
   (゚    )           __   ( __  ) (  ゴロン
    と   ヽ ( ̄))∧_∧  /´ `Y⌒)VUVJ_)
    (__ト、__丿 〉 》∩ _) (   .__つ´
          ヽ、.__,ノ   ヽ、__,.>



6月24日(土) | トラックバック(0) | コメント(0) | 日記 | 管理

この記事へのコメント投稿はできない設定になっています
コメントはありません。


(1/1ページ)