#99 Article 990 Posted at 1995/12/07 08:09:00 by MEX (MAP5294) [SAHOU.1]

Subject: Re:*7 プログラミングお作法の話 /988 ... /941 /940

> 質問は、この思いこみが正しいのかということと、例1のようなソースをコ
>ンパイルしたとき、例2のように勝手に最適化してくれるのでしょうかという

前者の質問についてですが、確かに例2の方が速くなります。
しかし順調にコード量は増えていきます。
最適化は小さくすることも意味しているので適材適所ではと思います。

例1を手元の処理系では、

(1)3か?なら(5)へ
(2)5か?なら(5)へ
(3)ATOIへコール
(4)同じか?ちがえば(6)へ
(5)にゃん表示系
(6)数値表示系

というそのものなマシンコードに変えていました。
||の評価順序は-->なので、そうなんでしょう。
これを見るとATOIを一度変数に置く方が高速化することがわかります。
(Cで簡潔に書いても高速化にはならない事例の一つ)
他には評価方法を変更しても高速化できます、

  k = atoi(argv[1]); /* 一度変数に */
  for (i = 1; i < k; i++) {
    if (i > 5 || i < 3 || i == 4) { /* 評価順序を変える */
      printf("%d\n", i);
    } else {
      for (j = 0; j < i; j++) printf("にゃん");
      putchar('\n');
    }
  }
  for (j = 0; j < k; j++) printf("にゃん");
  putchar('\n');

引数が大きくなると、i > 5 の所で評価終了してくれるので若干速くなります。
もっともstdoutが結構重いのでこのような例題では差が見えにくいです(^^;
(||だからいいものの評価順序不定の演算子は多いので敢えてこういう依存は
しない方がいい)
そういった訳で、アセンブラだとこういう姑息な手段も常套:)なのですが
Cのプログラムでは速さ重要視には懐疑的というのが私見です。
プログラム書くより読むことの方が多いので、可読性とかそういった方面の
事の方が本当は大事なのかもしれません。

後者の質問については、強力なオプティマイズを行うコンパイラを使った経験が
ないのでどうなのか解りません(^_^;
でもそんなたいへんな変換をするとなると、コンパイルは遅そうだ(笑)

MAP5294 MEX