割り算 VS 右シフト その3

この記事は割り算 VS 右シフト その2の続きです。

実行環境、検証方法などは、割り算 VS 右シフトを参照してください。

割り算 vs 右シフト(割る2 最適化)

 次に、最適化オプションをつけてコンパイルした場合、割り算と右シフトは実行速度に差が出るのかを調べることにした。

そこで、2種類のC言語ソースに-O1 -Sオプションをつけてコンパイルし、アセンブラソースを表示させた。2種類のC言語プログラムのアセンブラソースは全く同じになった。入手したアセンブラソースの一部は以下の通り。

1         .file    "div2.c"
2         .section    .rodata.str1.1,"aMS",@progbits,1
3     .LC0:
4         .string "%d\n"
5         .text
6     .globl main
7         .type   main, @function
8     main:
          ・・・
16        movl    $512, 4(%esp)
17        movl    $.LC0, (%esp)
          ・・・
27        .section .note.GNU-stack,"",@progbits

 16行目を見ると、val / 2を行った結果を直接スタック領域に格納していることが分かる。つまりgccコンパイル時に変数val / 2を計算してしまっているということである。なお、-O2, -O3オプションをつけて試してみたが、2種類のアセンブラソースに差異はなく、いずれもval / 2を行った結果を直接スタック領域に格納していることが分かった。

割り算 vs 右シフト(割る2 最適化)の結果

リテラルを対象とする場合は、実行速度は変わらない。

割り算 VS 右シフト その4に続く