ロボットのスピード

C-Styleのタイマーでプログラムの処理時間を図る方法は次の通り。

  1. タイマーをスタートさせる。
  2. 処理時間を図りたい処理を実行する。
  3. タイマーの値を変数にセットする。
  4. 変数の値をシリアルモニタに表示する。(センサモニターの見出し部分をダブルクリックしてからスタートスイッチを押す)


上のプログラムだと、砂時計1秒間の処理時間が変数Aにセットされ、変数Aをシリアルモニタに表示している。変数Aの値は1000(単位:ミリ秒)なので、処理時間は1秒であることが確認できる。
4行目のC-Codeは「printf("%ld", gV[VAR_A]);」と記述している。



直接タイマーの値を表示する場合は、3行目のC-Codeは「printf("%ld", gT[T1]);」と記述する。タイマー1の場合はT1、タイマー2の場合はT2、以下同様にタイマー4まで利用できる。


上記の2つのプログラムには処理時間に差が無いように見えるが、ここで「printf」の処理時間も図ってみる。タイマーはミリ秒単位でしか計測できず、1回の処理時間だと0ミリ秒になってしまったので、for文で100回繰り返した時間を図る。

変数Aの処理時間にはfor文の処理時間も含むので、中身のないfor文の時間も図って変数Bにセットする。AからBを引くことでprintfの100回文の処理時間が分かる。この例では「A-B = 42-0 = 42」なので、「printf("%ld", gV[VAR_A]);」の1回の処理時間は0.42ミリ秒となる。

より正確に測るなら、繰り返しももっと増やす。100x100=10000回の繰り返しで測った場合がこちら。

「A-B = 4221-34 = 4187」なので、「printf("%ld", gV[VAR_A]);」の1回の処理時間は0.4187ミリ秒となる。


変数Aにタイマー1の値を10000回セットする処理時間は、「A-B = 142-34 = 108」なので、「A=Timer1」の1回の処理時間は、0.0108ミリ秒となる。

「printf」の処理は「A=Timer1」に比べ、0.3097ミリ秒遅く、一桁遅いことが分かる。最初の2つプロラムでは差が出なかったが、より正確な時間を図るならば、タイマーの値を直接表示せずに、一旦タイマーの値を変数にセットして変数を表示すべき、と判断できる。

また、printfの実行にも処理時間かかることが分かったので、printfの使用はデバッグ中に限定し、本番時には削除して全体の処理速度を上げるべき、となる。


C-Style上で1行分の処理でも、内容によって処理時間が異なることが分かった。その他の処理も同様に処理時間を図り、遅い処理をなるべく避け、プログラムのスピードを上げる工夫をする。


なお、ここでの計測結果はあくまでも、手元にあるTJ3Bでの結果であり、他のTJ3Bでは結果が異なる可能性がある。また私が勘違いしている可能性もあるので、ここの数値を鵜呑みにせず、同様のテスト方法について考察し、自分なりに実験して結果を確認し、ロボットの性能upを図ってほしい。


個人的には、処理速度を上げたいならば、TJ3Bにはこだわらずに、より高速なCPUを使うマイコンボードを使うべきとは思うが、使う以上は性能を目一杯引き出してみたい。あくまで「ロボットの性能≒プログラムの性能」であり、「ロボットの性能≠CPUの性能」と考える。