RCX Codeの実行時間


はじめに

RCXのプログラムはどれぐらいの速度で実行されるのでしょうか?

NQCと、RCX標準環境と、ROBOLAB1.5は共に、RCX BYTE CODEを出力するので、基本になるRCX Byte codeの実行時間を正確に測定すれば、プログラム毎に速度を実測しなくても、コードから実行時間を推定できる様になります。

この課題に興味を持ち、実測したのは、2000年3月5日とLOGに残っています。もっと興味深い結果が出れば、すぐにまとめて発表したのですが、後述する様に実に単純な結果で、腰砕けになり、実験したのにそのまま結果を放置してしまいました。

他にも、興味がある方が、少なくとも2名はいることを知り1年以上たってようやく結果をまとめます。

ただ、全てのコードを体系的に網羅したのではなく、実験は極少数のプログラムで行っただけです。

 


実験方法

NQCを使い下記のようにPortをOn/Offするコードを書き、出力される電圧波形をオシロスコープで観測します。

Null_While.nqc
task main()
{
  while (true)
  {
    OnFwd(OUT_A);
    Off(OUT_A);
  }
  
}

その後、

PlayTone.nqc
task main()
{
  while (true)
  {
    OnFwd(OUT_A);
    PlayTone(440,1);
     
    Off(OUT_A);
  }
  
}

の様にOnFwd()とOff()の間に測定したいコードを挿入すれば、Onの時間の増加分が該当するコードの実行時間となります。ただ、もしかするとOnFwd()やOff()が実際に出力に反映されるのに、時間がかかり、しかもそれがばらつく危険性を予め調べる必要があります。

そのため、

app.nqc
int a;
task main()
{
  while (true)
  {
    OnFwd(OUT_A);
    a++;
    Off(OUT_A);
  }
}

a10pp.nqc
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

List

上記各プログラムのリストです。

a10pp.nqc
int a;
task main()
{
  while (true)
  {
    OnFwd(OUT_A);
    a++;
    a++;
    a++;
    a++;
    a++;
    a++;
    a++;
    a++;
    a++;
    a++;
    Off(OUT_A);
  }
}

adiv.nqc
int a;
task main()
{
  while (true)
  {
    OnFwd(OUT_A);
    a /= 2;
    Off(OUT_A);
  }
}

amul.nqc
int a;
task main()
{
  while (true)
  {
    OnFwd(OUT_A);
    a *= 2;
    Off(OUT_A);
  }
}

app.nqc
int a;
task main()
{
  while (true)
  {
    OnFwd(OUT_A);
    a++;
    Off(OUT_A);
  }
}

collision.nqc
task t1()
{
  while (true)
  {
    OnFwd(OUT_A);
  }
}

task t2()
{
  while (true)
  {
    Off(OUT_A);
  }
}

task main()
{
  start t1;
  start t2; 
}

if.nqc
task main()
{
  SetSensor(SENSOR_1,SENSOR_TOUCH);
                               
    while (true){
    OnFwd(OUT_A);
    if (SENSOR_1 == 0)
    {
      Off(OUT_A);
      
    }
    else
    {
      Off(OUT_A);  
    }
  }
  
}

null_do_while.nqc
task main()
{
  
  do {
    OnFwd(OUT_A);
    Off(OUT_A);
  } while (true);
  
}

null_while.nqc
task main()
{
  while (true)
  {
    OnFwd(OUT_A);
    Off(OUT_A);
  }
  
}

playsound.nqc
task main()
{
  while (true)
  {
    OnFwd(OUT_A);
    PlaySound(1); 
    Off(OUT_A);
  }
  
}

playtone.nqc
task main()
{
  while (true)
  {
    OnFwd(OUT_A);
    PlayTone(440,1);
     
    Off(OUT_A);
  }
  
}

repeat100.nqc
task main()
{
  
  repeat (100) {
    OnFwd(OUT_A);
    Off(OUT_A);
  }  
}

sendmessage.nqc
task main()
{
  while (true)
  {
    OnFwd(OUT_A);
    SendMessage(1);            
    Off(OUT_A);
  }
  
}

setpower.nqc
task main()
{
  while (true)
  {
    OnFwd(OUT_A);
    SetPower(OUT_B,4); 
    Off(OUT_A);
  }
  
}

Copyright © 2002

MindStormsの洞窟に戻る

Google