SelectCaseとIfで速いのはどっち?

VBAで、値によって違った処理をする場合には、Ifを使うのが普通ですが、値が多く選択肢が多い場合にはSelectCaseを使います。また単純に値を返すだけならば配列変数を使うかもしれません。
使いやすいものを使えばよいと思いますが、処理時間はどうでしょうか。

サンプル1 – 配列変数

Function test1(num)
    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

サンプル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

どのサンプルも、あらかじめセットした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

一致した場合は、処理を終えるようにしました。
この場合の実行時間は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

例えば、80番目の値を拾うために79番目までをすべてチェックする必要はないわけです。
そこで100個を4分割して、0番目、25番目、50番目、75番目にジャンプするように場合分けしました。
この場合の実行時間は9秒となりました。効果絶大です。
なお、この場合分けを細かくし過ぎると逆効果ですし、プログラミングも面倒になりますので、使いどころを考える必要があるかもしれません。

サンプル 時間
配列変数 36秒
SelectCase 25秒
If(単純) 52秒
If(終了) 27秒
If(場合分け) 9秒

コメント

  1. […] switchとifで速いのはどっち?(JavaScript) 2011 年 6 月 16 日 コメントをどうぞ コメント 前に、VBAで「SelectCaseとIfで速いのはどっち?」というのを調べてみましたが、今度はJavaScriptで同じことをしてみました。なお、SelectCaseはswitchに置き換えます。 サンプルコードは省略しますが、同様の関数を作り、10000回繰り返したときの実行時間を測りました。 […]

タイトルとURLをコピーしました