佐々木屋

技術的なことから趣味まで色々書きます

型変換は何を使う?(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がおススメです。