次はArduino MEGA 2560とchipKit Max32を比較してみた。ちなみにインストールはUSBドライバだけ、というのはArduino Unoなどと一緒だが、Arduio MEGA 2560はちゃんとデバイス名が出てくる(Photo01)のに、chipKit Max32はFTDIのUSB-RS232Cチップを使っている関係で"USB Serial Port"なのは仕方ないところか。
Photo01: きちんとArduino Mega 2560の名前が出てくるのは、今回の様に複数のArduinoだのchipKitだのを同時に繋いでいる場合には助かる。 |
Photo02: FTDIのチップを使う欠点の一つがこれかもしれない。 |
まずは前回のList1をそのまま行ってみると、
プログラムサイズ | 点灯時 | 消灯時 | |
---|---|---|---|
Arduino MEGA 2560 | 1588Bytes | 46mA | 30mA |
chipKit Max32 | 6616Bytes | 115mA | 99mA |
といったところ。点灯時にはLEDに16mAほど流れている訳で、それを除くと概ねchipKit Max32の消費電力はArduino MEGA 2560の3.3倍という、こちらもchipKit Uno32とArduino Unoに近い数字になった。プログラムサイズは更に肥大化しているが、利用できるデバイスが多い分、初期化コードも多いためと思われる。
次に、やはり前回のList2をそのまま実行してみると、
プログラムサイズ | 所要時間 | 消費電流 | |
---|---|---|---|
Arduino MEGA 2560 | 1722 Bytes | 101.97秒 | 34mA |
chipKit Max32 | 6700 Bytes | 3.45秒 | 118mA |
というちょっと驚きの結果に。おや? と思って今度はAruduino Uno32でテストをしなおすと、所要時間はやはり102秒ほどに。一度ターゲットボードをArduino MEGA 2560にしてコンパイル後にターゲットボードをArduino Unoに切り替えてコンパイルしなおしたら、正しく(?)102秒ほど掛かることになった。何かしら最適化で異なる部分があったのかもしれない。理由はともかくとして、そうなると性能比は前回の3倍ではなく、102秒:3.5秒ほどだから29倍強ということになる。394回でちょっとまとめたとおり、そもそも動作速度が結構違うしコアそのものの性能も異なるから、前回の結果はちょっと性能差が少なすぎる気がした。動作周波数比で4:1もしくは5:1で、しかもIPCが恐らく2:1程度に違うから10倍程度の性能差はあるだろうというのが筆者の目算で、なので、今回の結果の方がまだ納得できる(前回のArduino Unoの結果はちょっと謎だが)。
とはいえ30倍近いとなると、色々使い方を考える必要がある。例えばタイミングを取る際に、いわゆるDelay loop的なものを使っているとタイミングが当然狂ってくるだろう。もっともこれまでArduino IDEを使ってきた経験で言うと、すごく簡単なDelay loopだとArduino IDEの最適化でDelayの役を果たさなくなる関係で、最適化の対象にならないように色々策を講じる必要があるから、全部が全部駄目というつもりはないが、Delay loopはdelay()やdelayMicroseconds()を使う方が賢明だろう。
もう一つは、筆者の様にPCと連動して動かすような周辺機器を考える場合、PC側の処理をArduino(というかchipKit)側に多少オフロードしてもいけそうな気がする。Arduinoとの互換性を考えるとこれは難しいところではあるが。Arduinoで周辺機器を作る場合、データの転送をどれだけ減らせるのかが一つのコツで、なので可能ならばArduinoなりchipKitなりでデータ処理を行ってデータを減らす方策を採るわけだが、chipKitだと処理をだいぶオフロードできそうである。もっとも、整数演算に関してはともかく浮動小数点演算はやはりどうしようもないようだ。List3の様に、List2をちょっとだけ作り変えてみた。ちなみにREPEATを90000→900に減らし、かつlpCnt1のループ回数を500→5にしたので、900×900=81万回を5回繰り返すから、405万回。整数の場合と比較してトータルで100万分の1の演算回数である。これを実施した結果を見てみると、
プログラムサイズ | 所要時間 | 消費電流 | |
---|---|---|---|
Arduino MEGA 2560 | 1722 Bytes | 102.25秒 | 44mA |
chipKit Max32 | 9120 Bytes | 10.11秒 | 131mA |
となった。FPUを持たないからエミュレーションルーチンで処理することになるわけで、遅いのは当然であるが、Arduino MEGA 2560の場合で100万倍、chipKit Max32の場合で300万倍も遅くなるとはちょっと想像しなかった。あくまでも整数演算レベルで行える処理だけをArduinoなりchipKitで行い、浮動小数点演算をしないといけない様な処理はやはりPCにやらせるのが正解という事のようだ。
(続く)
List3:
#define REPEAT 900
void setup()
{
pinMode(12, OUTPUT);
}
void loop()
{
unsigned long lpCnt1,lpCnt2,lpCnt3;
float num;
delay(1000);
digitalWrite(12, HIGH);
for(lpCnt1=0; lpCnt1<5; lpCnt1++)
{
for(lpCnt2=0; lpCnt2 0) digitalWrite(12, LOW);
else digitalWrite(12, LOW);
while(1);
}