xgawk で if 文と switch 文の速度を比べる

xgawk は時間関数の拡張もされていて、秒以下の時間を gettimeofday() 関数で取得することができますから、こうしたベンチマークにも使うことができます。触発されたのは switchとifの速度を比べてみた です。

実際には以下のようなスクリプトを用意しました。

#! /usr/local/bin/xgawk -f
@load time

BEGIN {
    start_time = gettimeofday();
    IF();
    if_time = gettimeofday() - start_time;
    print "if:     " if_time * 1000 " (msec)";
    SWITCH();
    switch_time = gettimeofday() - start_time - if_time;
    print "switch: " switch_time * 1000 " (msec)";
}

function IF() {
    a[0] = a[1] = a[2] = a[3] = a[4] = a[5] = a[6] = 0;
    for (i = 1; i <= 1000000; i++) {
        tmp = i % 7;
        if (tmp == 0) {a[0]++}
        else if (tmp == 1) {a[1]++}
        else if (tmp == 2) {a[2]++}
        else if (tmp == 3) {a[3]++}
        else if (tmp == 4) {a[4]++}
        else if (tmp == 5) {a[5]++}
        else {a[6]++}
    }
}

function SWITCH() {
    a[0] = a[1] = a[2] = a[3] = a[4] = a[5] = a[6] = 0;
    for (i = 1; i <= 1000000; i++) {
        tmp = i % 7;
        switch(tmp) {
        case 0:
            a[0]++;break;
        case 1:
            a[1]++;break;
        case 2:
            a[2]++;break;
        case 3:
            a[3]++;break;
        case 4:
            a[4]++;break;
        case 5:
            a[5]++;break;
        default:
            a[6]++;
        }
    }
}

論より証拠で実行してみます。

$ xgawk -f if_switch.awk
if:     2833.15 (msec)
switch: 2421.24 (msec)

常に switch 文の方が高速に動作していました。

なお、gawk で switch 文を使うには configure 時に 'enable-switch' を設定する必要があります。

tag_gawk.pngtag_gawk.png