C-Style の実行時間について

次のようなプログラムで1秒間に各コマンドが何回実行できるか調べる。
6行目に調査したいコマンドを入れる。

f:id:ohguma:20190302095649p:plain


手元のTJ3Bでの結果は次の通り。INPUTの参照は変数の参照と変わらない回数が実行できた。
だが、PINGポートの参照は実行回数が大幅に少なく、ぶっちぎりに時間がかかっていることが確認できる。

  • 74,323回 X=X+10
  • 74,323回 X=CN1
  • 46,123回 MT(L:50 R:50)
  • 201回 MT(6ch 0,0,0,0,0,0)
  • 50回 X=CN10:PING


このことをロボットに活用することを考える。
CN10に超音波センサーを接続し、

  • 20cm 以上離れたら緑LEDをON
  • 10cm 以上離れたら赤1LEDをON、

というプログラムを上の6行に入れて、1秒間の処理回数を調べる。処理回数が多いほど細かい制御ができる。

2つのIF文でそれぞれ距離を判断する場合、1秒間に25回の処理ができた。
f:id:ohguma:20190302121733p:plain

IF文を入れ子にし、10cm以上離れている場合のみ20cmの判断をする場合は、距離に応じて1秒間の処理回数が変わった。
10cm未満ならば1秒間に50回、10cm以上なら25回の処理ができた。
距離が変動する場合は、25~50回の間になった。
f:id:ohguma:20190302121748p:plain


PINGポートの参照は、変数の参照比べて数桁レベルで遅いことが上でわかっているので、処理回数をかせぐには、PINGポートの参照を減らすことが大切になる。
PINGポートを距離を変数に代入しておけば、2つのIF文がある場合でも1秒間に50回の処理ができた。
最初の例と比べると処理結果は同じにもかかわらず、処理回数が2倍(1回あたりの処理時間が半分)になっている。
f:id:ohguma:20190302121801p:plain

当然、変数を使いかつIF文を入れ子にすれば、さらに高速化されるが、PINGポートの参照と比べれは他の処理は十分に速いので、入れ子にしてプログラムの可読性を落とすよりは、入れ子はなるべく使わず、プログラムの見やすさを保つことも大切だと思う。