VBAで、値によって違った処理をする場合には、Ifを使うのが普通ですが、値が多く選択肢が多い場合にはSelectCaseを使います。また単純に値を返すだけならば配列変数を使うかもしれません。
使いやすいものを使えばよいと思いますが、処理時間はどうでしょうか。
サンプル1 – 配列変数
Function test1(num)
Dim a(100)
a(0) = 404
a(1) = 194
省略
a(99) = 547
test1 = a(num)
End Function
Dim a(100)
a(0) = 404
a(1) = 194
省略
a(99) = 547
test1 = a(num)
End Function
サンプル2 – SelectCase
Function test2(num)
Select Case num
Case 0: temp = 404
Case 1: temp = 194
省略
Case 99: temp = 547
End Select
test2 = temp
End Function
Select Case num
Case 0: temp = 404
Case 1: temp = 194
省略
Case 99: temp = 547
End Select
test2 = temp
End Function
サンプル3 – If
Function test3(num)
If num = 0 Then temp = 404
If num = 1 Then temp = 194
省略
If num = 99 Then temp = 547
test3 = temp
End Function
If num = 0 Then temp = 404
If num = 1 Then temp = 194
省略
If num = 99 Then temp = 547
test3 = temp
End Function
どのサンプルも、あらかじめセットした100個の適当な数から、n番目の数を返すというものです。
サンプル1は、配列変数にセットした値を返します。見た目は最もシンプル。
サンプル2は、SelectCaseを使った場合です。場合分けの場合はこれを使うのが一般的です。
サンプル3は、Ifを使った場合です。
これらを1000万回繰り返したときの実行時間を調べました。
サンプル | 時間 |
---|---|
配列変数 | 36秒 |
SelectCase | 25秒 |
If(単純) | 52秒 |
SelectCaseを使った場合が最も速いという結果になりました。
Ifのサンプルは、If行を全部チェックして値が一致するものを探すので時間がかかります。SelectCaseは一致した場合、その後のケースはチェックしません。
このIfのサンプルは書き方が酷すぎるのでちょっと変えてみました。
サンプル4 – If(終了)
Function test4(num)
If num = 0 Then test4 = 404: Exit Function
If num = 1 Then test4 = 194: Exit Function
省略
If num = 99 Then test4 = 547: Exit Function
End Function
If num = 0 Then test4 = 404: Exit Function
If num = 1 Then test4 = 194: Exit Function
省略
If num = 99 Then test4 = 547: Exit Function
End Function
一致した場合は、処理を終えるようにしました。
この場合の実行時間は27秒となり半減しました。
さらに工夫します。
サンプル5 – If(場合分け+終了)
Function test5(num)
If num < 25 Then
If num = 0 Then test5 = 404: Exit Function
If num = 1 Then test5 = 194: Exit Function
省略
ElseIf num < 50 Then
省略
ElseIf num < 75 Then
省略
Else
省略
If num = 99 Then test5 = 547: Exit Function
End If
End Function
If num < 25 Then
If num = 0 Then test5 = 404: Exit Function
If num = 1 Then test5 = 194: Exit Function
省略
ElseIf num < 50 Then
省略
ElseIf num < 75 Then
省略
Else
省略
If num = 99 Then test5 = 547: Exit Function
End If
End Function
例えば、80番目の値を拾うために79番目までをすべてチェックする必要はないわけです。
そこで100個を4分割して、0番目、25番目、50番目、75番目にジャンプするように場合分けしました。
この場合の実行時間は9秒となりました。効果絶大です。
なお、この場合分けを細かくし過ぎると逆効果ですし、プログラミングも面倒になりますので、使いどころを考える必要があるかもしれません。
サンプル | 時間 |
---|---|
配列変数 | 36秒 |
SelectCase | 25秒 |
If(単純) | 52秒 |
If(終了) | 27秒 |
If(場合分け) | 9秒 |
コメント
[…] switchとifで速いのはどっち?(JavaScript) 2011 年 6 月 16 日 コメントをどうぞ コメント 前に、VBAで「SelectCaseとIfで速いのはどっち?」というのを調べてみましたが、今度はJavaScriptで同じことをしてみました。なお、SelectCaseはswitchに置き換えます。 サンプルコードは省略しますが、同様の関数を作り、10000回繰り返したときの実行時間を測りました。 […]