とりあえず、簡単に分かるのは、『シフト演算は、加減乗除の演算より速い』ということ。それから、2進数に対してシフトを行うので、『被演算子は、左へ1シフトすれば2倍に、右に1シフトすれば2倍になる』ということ。
じゃー、実際にどれくらい速いのだろうということで、実験をしてみます。
ソースは以下のとおり。
int main() {
int x;
double t;
t = gettimeofday_sec();
REP(i, 1e8)
x = i + i;
printf("%lf\n", gettimeofday_sec() - t);
t = gettimeofday_sec();
REP(i, 1e8)
x = 2* i;
printf("%lf\n", gettimeofday_sec() - t);
t = gettimeofday_sec();
REP(i, 1e8)
x = i << 1;
printf("%lf\n", gettimeofday_sec() - t);
}
同様の処理を行う3つのループ。それぞれ、足算、掛算、シフト演算で計算を行っている。処理速度を見てみると・・・・。。
以下実行結果。
0.354000
0.274000
0.252000
うーーん、コンパイル時に掛算はシフト演算に置き換えられているのかもしれない。
(ちなみに、コンパイラはgcc3.4.5)
足算より掛算の方が遅くなるはずだが・・・
何はともあれ、シフト演算が速いのは間違いなさそう。そして、さり気にシフト演算を使っていると何となく”出来そう”に見える。
ということで、次回は、シフト演算を使ってどんな事ができるのか見て行きましょう。
0 件のコメント:
コメントを投稿