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) | 日記 | 管理
|
この記事へのコメント投稿はできない設定になっています |