キャスト(型変換)って、方法は色々とありますが速度を気にしたことはありますか?
今回は文字列から数値に変換する場合に使用するキャストと、数値から文字列に変換する場合に使用するキャストの速度比較をおこないたいと思います。
文字列から数値に変換
下記 2 とおりのキャスト方法について速度比較をおこないます。
- Integer.Parse
- CInt
処理速度に明確な差を出すため、1,000 万回のループでキャストを実行しています。
また、変換文字列は「123」としていますが、深い意味はありません。
Private Sub CastStrToInt()
Dim intTemp As Integer
'Integer.Parse 変換
Dim tc1 As Integer = System.Environment.TickCount
For i As Integer = 1 To 10000000
intTemp = Integer.Parse("123")
Next
'計測時間を算出してミリ秒で表示
tc1 = System.Environment.TickCount - tc1
Debug.Print("Integer.Parse で計測: {0}ミリ秒", tc1)
'CInt 変換
Dim tc2 As Integer = System.Environment.TickCount
For i As Integer = 1 To 10000000
intTemp = CInt("123")
Next
'計測時間を算出してミリ秒で表示
tc2 = System.Environment.TickCount - tc2
Debug.Print("CInt で計測: {0}ミリ秒", tc2)
Ennd Sub
実測結果は、
- Integer.Parse で計測: 20757 ミリ秒
- CInt で計測: 31405 ミリ秒
でした。
CInt の方が Integer.Parse よりも、約 1.5 倍遅いことがわかりました。
文字列から数値に変換する場合は、Integer.Parse の方をおすすめします!
数値から文字列に変換
下記 2 とおりのキャスト方法について速度比較をおこないます。
- ToString
- CStr
処理速度に明確な差を出すため、1,000 万回のループでキャストを実行しています。
また、変換文字列は「123」としていますが、深い意味はありません。
Private Sub CastIntToStr()
Dim strTemp As String
Dim intVal As Integer = 123
'ToString 変換
Dim tc1 As Integer = System.Environment.TickCount
For i As Integer = 1 To 10000000
strTemp = intVal.ToString()
Next
'計測時間を算出してミリ秒で表示
tc1 = System.Environment.TickCount - tc1
Debug.Print("ToString で計測: {0}ミリ秒", tc1)
'CStr 変換
Dim tc2 As Integer = System.Environment.TickCount
For i As Integer = 1 To 10000000
strTemp = CStr(intVal)
Next
'計測時間を算出してミリ秒で表示
tc2 = System.Environment.TickCount - tc2
Debug.Print("CStr で計測: {0}ミリ秒", tc2)
End Sub
実測結果は、
- ToString で計測: 1370 ミリ秒
- CStr で計測: 1398 ミリ秒
でした。
ほぼ変わらないという結果となりました。
文字列から数値に変換する際に、Integer.Parse を使用するなら合わせるという意味で、ToString を使用した方がブログラムが綺麗に見える気がしますね。
キャストには、今回、計測した以外にも様々あります。
例えば、Convert や DirectCast 等々。
また、使用用途により何を使用するかは変わると思います。
例えば、Integer.Parse("123,456") ではエラーが発生しますが、CInt("123,456") ではエラーは発生しません。
ようは、変換する値にカンマが入っている場合、Integer.Parse ではエラーが発生しますが、CInt ではエラーは発生しません。
使用用途にもよりますが、処理速度を気にしてプログラムを開発した方が良いかなと思います!