読者です 読者をやめる 読者になる 読者になる

break vs goto

programmer

Gaucheでgotoでswitchの前まで戻ってくるようになっていて、速度的に違いはあるのか疑問に思ったので実験。

while( hoge ) {
    switch( fuga ) {
        case 0:
           break;
        ...
        default:
           break;
    }
    /* break したらここに来る? */
}

というアセンブリが吐かれればgotoで

dispatch:
while( hoge ) {
    switch( fuga ) {
        case 0:
           goto dispatch;
        ...
        default:
           goto dispatch;
    }
}

とした方がジャンプが一回減って速くなりそうではある。

http://www.bitbucket.org/kokosabu/my/src/tip/test01.c

に置いたコードで試験した限りでは速度に変わりなし(gcc 4.2.1)。
アセンブリを見るとbreakの方が最適化がかかって1回のジャンプでループのところまで戻っている。

Gaucheをさっき見たらswitchを抜けたあとに行う処理もあって、break vs gotoといった単純な話ではないけど最適化なかなかやってくれるなと思った。

追記

tcc 0.9.24でも試してみましたが、特にbreakとgotoの違いはみられず。

これも試したりした方がいいのではとか、これで試してみたらこんな結果になったなどがありましたらコメントとかトラックバックとかしてくれると嬉しいです。