|
■No100217 (魔界の仮面弁士) に追記
> そもそも Val と CSng と Single.Parse では、それぞれの変換仕様が
> 微妙に異なっているので、ロジックだけでは単純比較ができませんでした。
> パフォーマンスの差は、実際に測定してみないと分からない所ですね。
No100223 の伝説のカレーさんの投稿で、速度面で Val の優位性が明らかに…!
.NET Core、.NET Framework バージョンの差でも変わってきたりするんでしょうかね。
CSng は全角数字も解釈するので、多分遅いとは思ってましたが、Val が予想以上にはやくて吃驚です。
以下、それぞれの変換仕様の差について例示。
たまに「Val だと変換エラーにならない」と書かれた記事を見ることがあるので、その否定を兼ねて…。
なお CSng の変換仕様は、VBA と .NET では異なります。
"1,234.56" を変換した場合
Single.Parse(s) → 1234.56F
CSng(s) → 1234.56F
CSng(Val(s)) → 1.0F
"1d 3h" を変換した場合
Single.Parse(s) → エラー
CSng(s) → エラー
CSng(Val(s)) → 1000.0F
"123.4.5" を変換した場合
Single.Parse(s) → エラー
CSng(s) → エラー
CSng(Val(s)) → 123.4F
"&H12" を変換した場合
Single.Parse(s) → エラー
CSng(s) → 18.0F
CSng(Val(s)) → 18.0F
"&o123" を変換した場合
Single.Parse(s) → エラー
CSng(s) → 83.0F
CSng(Val(s)) → 83.0F
"100%" を変換した場合
Single.Parse(s) → エラー
CSng(s) → エラー
CSng(Val(s)) → 100.0F
"1.23%" を変換した場合
Single.Parse(s) → エラー
CSng(s) → エラー
CSng(Val(s)) → エラー ※Val がエラーを返すパターン
"1.23" を変換した場合
Single.Parse(s) → エラー
CSng(s) → 1.23F
CSng(Val(s)) → 0.0F
"(12.34)" を変換した場合
Single.Parse(s) → エラー
CSng(s) → -12.34F
CSng(Val(s)) → 0.0F
"1.23E+45" を変換した場合
Single.Parse(s) → エラー
CSng(s) → エラー
CSng(Val(s)) → Single.Infinity
"∞" を変換した場合
Single.Parse(s) → Single.Infinity
CSng(s) → Single.Infinity
CSng(Val(s)) → 0.0F
|