RCXのプログラムはどれぐらいの速度で実行されるのでしょうか?
NQCと、RCX標準環境と、ROBOLAB1.5は共に、RCX BYTE CODEを出力するので、基本になるRCX Byte codeの実行時間を正確に測定すれば、プログラム毎に速度を実測しなくても、コードから実行時間を推定できる様になります。
この課題に興味を持ち、実測したのは、2000年3月5日とLOGに残っています。もっと興味深い結果が出れば、すぐにまとめて発表したのですが、後述する様に実に単純な結果で、腰砕けになり、実験したのにそのまま結果を放置してしまいました。
他にも、興味がある方が、少なくとも2名はいることを知り1年以上たってようやく結果をまとめます。
ただ、全てのコードを体系的に網羅したのではなく、実験は極少数のプログラムで行っただけです。
NQCを使い下記のようにPortをOn/Offするコードを書き、出力される電圧波形をオシロスコープで観測します。
task main() { while (true) { OnFwd(OUT_A); Off(OUT_A); } }
その後、
task main() { while (true) { OnFwd(OUT_A); PlayTone(440,1); Off(OUT_A); } }
の様にOnFwd()とOff()の間に測定したいコードを挿入すれば、Onの時間の増加分が該当するコードの実行時間となります。ただ、もしかするとOnFwd()やOff()が実際に出力に反映されるのに、時間がかかり、しかもそれがばらつく危険性を予め調べる必要があります。
そのため、
int a; task main() { while (true) { OnFwd(OUT_A); a++; Off(OUT_A); } }
と
int a; task main() { while (true) { OnFwd(OUT_A); a++; a++; a++; a++; a++; a++; a++; a++; a++; a++; Off(OUT_A); } }
を比較し、null_whileのOnが2ms、appが4ms、a10ppが22〜25msである事を確認しました。
a++一回当たりの時間は2msとなり、この測定法は正しく機能するようです。
一覧表を示します。
意味があるのは、onの時間ですが、参考のためoffの時間も測定しました。カンマで区切ってあるのは、値にばらつきがあったもので、上限と下限で示しました。時間の単位は全てmsです。
program | on | off |
null_while | 2 | 6 |
null_do_while | 2 | 6 |
repeat100 | 4 | 8 |
setpower | 4 | 6 |
playsound | 4 | 6 |
playtone | 4 | 6 |
if(分岐しない時 ) | 4 | 8 |
if(分岐した時 ) | 4 | 6 |
sendmessage | 4 | 8 |
app | 4 | 6 |
amul | 4 | 6 |
adiv | 4 | 6 |
collision | 1,3 | 4,7 |
a10pp | 22,25 | 6 |
上記各プログラムのリストです。
int a; task main() { while (true) { OnFwd(OUT_A); a++; a++; a++; a++; a++; a++; a++; a++; a++; a++; Off(OUT_A); } }
int a; task main() { while (true) { OnFwd(OUT_A); a /= 2; Off(OUT_A); } }
int a; task main() { while (true) { OnFwd(OUT_A); a *= 2; Off(OUT_A); } }
int a; task main() { while (true) { OnFwd(OUT_A); a++; Off(OUT_A); } }
task t1() { while (true) { OnFwd(OUT_A); } } task t2() { while (true) { Off(OUT_A); } } task main() { start t1; start t2; }
task main() { SetSensor(SENSOR_1,SENSOR_TOUCH); while (true){ OnFwd(OUT_A); if (SENSOR_1 == 0) { Off(OUT_A); } else { Off(OUT_A); } } }
task main() { do { OnFwd(OUT_A); Off(OUT_A); } while (true); }
task main() { while (true) { OnFwd(OUT_A); Off(OUT_A); } }
task main() { while (true) { OnFwd(OUT_A); PlaySound(1); Off(OUT_A); } }
task main() { while (true) { OnFwd(OUT_A); PlayTone(440,1); Off(OUT_A); } }
task main() { repeat (100) { OnFwd(OUT_A); Off(OUT_A); } }
task main() { while (true) { OnFwd(OUT_A); SendMessage(1); Off(OUT_A); } }
task main() { while (true) { OnFwd(OUT_A); SetPower(OUT_B,4); Off(OUT_A); } }Copyright © 2002