最適化の罠

最適化と聞いても何の事だかわからないかもしれないが....

要するにプログラマの意図に反してコンパイラがプログラムを改変する事で、

  1. 実行形式を可能な限り小さくする。(プログラムサイズの最適化)
  2. 実行形式のプログラムが、可能な限り高速に動作するようにする。(実行速度の最適化)

のような実行形式を作成する事を言う。(参考資料)

... で、問題となるのは、以下の様な場合。
 

int main()
{
       int    w;
       .....
      while (1) {
           PORTD = 0x01;   // PD0につながったLEDを点灯
          for (w=0; w<9999999; w++);   // ※1  待ち時間
           PORTD = 0x00;   // PD0につながったLEDを消灯
          for (w=0; w<9999999; w++);   // ※2  待ち時間
      }
}


※1と※2のforループは、LEDの点滅を分かり易くするための待ち時間だが、プログラムの動作(ロジックともいう)には、時間の消費以外には、何ら影響を与えていない。つまりコンパイラからしてみれば、余分な時間を浪費する邪魔物と映るわけだ。
 従って、プログラムを高速化する(つまり最適化)を行いたいコンパイラは、このような処理を見つけると、プログラマの意図を無視して(というか、そんなもの理解できない)処理そのものを取り除いて実行形式を作成しようとする。
 こういった、余計なお世話をしてほしくない場合は、以下の様にプログラミングすること。

int main()
{
      volatile  int    w;   // 最適化の抑止
       .....
      while (1) {
           PORTD = 0x01;   // PD0につながったLEDを点灯
           for (w=0; w<9999999; w++);   // ※1  待ち時間
           PORTD = 0x00;   // PD0につながったLEDを消灯
           for (w=0; w<9999999; w++);   // ※2  待ち時間
      }
}


 

最終更新:2017年10月04日 09:26