型変換は何を使う?(string型⇒値型)
おおむね型変換が出そろったところで、「どれを使うか?」をシリーズで考えてみます。今回はstring型⇔値型です。
なお、以下は共通認識とします。
- VB.NETのCIntやCDecなどのC●●●は、CTypeと等価なので全てCTypeで検証
- 時間計測はSystem.Diagnostics名前空間のStopwatchクラスを利用
- 繰り返し回数maxは10,000,000回とする
- それぞれを3回ずつ実行する
値型は何でもいいですが、例としてdecimal型にします。
考えられる候補は、Parse、TryParse、Convert、CType(VB.NETのみ)です。
string b = "123456789"; sw.Start(); for (int i = 1; i <= max; ++i) { decimal res = decimal.Parse(b); } sw.Stop(); Console.WriteLine(sw.Elapsed.ToString() + " Parse"); sw.Reset(); sw.Start(); for (int i = 1; i <= max; ++i) { decimal res; decimal.TryParse(b, out res); } sw.Stop(); Console.WriteLine(sw.Elapsed.ToString() + " TryParse"); sw.Reset(); sw.Start(); for (int i = 1; i <= max; ++i) { decimal res = Convert.ToDecimal(b); } sw.Stop(); Console.WriteLine(sw.Elapsed.ToString() + " Convert"); sw.Reset();
Dim b As String = "123456789" sw.Start() For i As Integer = 1 To max Dim res As Decimal = Decimal.Parse(b) Next sw.Stop() Console.WriteLine(sw.Elapsed.ToString() & " Parse") sw.Reset() sw.Start() For i As Integer = 1 To max Dim res As Decimal Decimal.TryParse(b, res) Next sw.Stop() Console.WriteLine(sw.Elapsed.ToString() & " TryParse") sw.Reset() sw.Start() For i As Integer = 1 To max Dim res As Decimal = Convert.ToDecimal(b) Next sw.Stop() Console.WriteLine(sw.Elapsed.ToString() & " Convert") sw.Reset() sw.Start() For i As Integer = 1 To max Dim res As Decimal = CType(b, Decimal) Next sw.Stop() Console.WriteLine(sw.Elapsed.ToString() & " CType") sw.Reset()
結果は以下の通りです。
項目 | C# |
VB.NET |
Parse | 00:00:04.0843324 00:00:04.0071688 00:00:04.0258846 |
00:00:04.1525407 00:00:04.1765828 00:00:04.1367350 |
TryParse | 00:00:03.5734163 00:00:03.9375578 00:00:03.7797352 |
00:00:04.2536078 00:00:03.7364092 00:00:03.7153848 |
Convert | 00:00:03.2411293 00:00:04.4254836 00:00:04.0727183 |
00:00:03.5367364 00:00:03.8929688 00:00:04.3436585 |
CType | × | 00:00:19.3601235 00:00:17.0757886 00:00:18.0969521 |
以外なのはParseよりTryParseの方が高速ということです。ただどんぐりの背比べなので、ほぼ同等と考えて良いでしょう。結果的にはConvertが一番早い結果となりました。CTypeは論外ですね。
但し、nullの判断や例外発生のリスクと速度のバランスを考えると、変換の成功有無が確認できるTryParseが一番おすすめです。
結論、string型⇒値型はTryParseがおススメです。