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