ATtiny85のベンチマーク


ATtiny85ベンチマーク

こちらのベンチマークの続きである。

Dhrystoneはダメだった

本当はDhrystoneを動作させたかったが、ATtiny85の容量が足りず、プログラムをそのままの形では実行できず断念。

代わりに

どこかのページ(失念)を参考に、四則演算を繰り返し行うソースコードをつくり、Arduino(ATmega328p)と比較することにした。

ATtiny85の結果をArduinoに転送

こちらのソフトウェアシリアル手法を使ってATtiny85の計算結果をArduinoに転送した。この方法だと、残念ながら、ATtiny85のクロックは1MHzとなってしまう(本来は20MHz?)。なおArduinoのクロックは16MHzである。

ATtiny85およびArduino共通ソースコード

Benchmarkとして適切かどうかは不明であるが、10000回、四則演算した時間を計測する。

#define NUM 1000*10
char buf[128];
void pseudo_benchmark() {
  volatile float value; // "volatile" is necessary.
  uint32_t t0, t1, len, i;

  memset(buf, 0, sizeof(buf));
  sprintf(buf, "\nATtiny85-Start\n");  // ここは「ATtiny85」または「Arduino」となる
  t0 = millis();
  value = 1.0;
  for (i = 0; i < NUM; i++) {
    value += 0.1;
  }
  t1 = millis();
  sprintf(buf+strlen(buf), " +: %d\n", t1 - t0);

  t0 = millis();
  value = 12345678.0;
  for (i = 0; i < NUM; i++) {
    value -= 0.1;
  }
  t1 = millis();
  sprintf(buf+strlen(buf), " -: %d\n", t1 - t0);

  t0 = millis();
  value = 1.0;
  for (i = 0; i < NUM; i++) {
    value *= 1.1;
  }
  t1 = millis();
  sprintf(buf+strlen(buf), " *: %d\n", t1 - t0);

  t0 = millis();
  value = 12345678.0;
  for (i = 0; i < NUM; i++) {
    value /= 1.1;
  }
  t1 = millis();
  sprintf(buf+strlen(buf), " /: %d\n", t1 - t0);

  sprintf(buf+strlen(buf), "ATtiny85-End\n");  // ここは「ATtiny85」または「Arduino」となる
}

ATtiny85ソースコード

ATtiny85PseudoBenchmark.ino
#include <SoftwareSerial.h>
SoftwareSerial mySerial(3, 4); // RX, TX

// ここに上記の共通ソースコードあり

void setup()
{
  mySerial.begin(4800);
  pseudo_benchmark();
}

void loop()
{
  if (mySerial.available()) {
    (void)mySerial.read(); // throw away
    for (int i = 0; i < strlen(buf); i++) {
      mySerial.write(buf[i]);
    }
  }
}

Arduinoソースコード

ArduinoPseudoBenchmark.ino
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX

// ここに上記の共通ソースコードあり

void setup()
{
  Serial.begin(9600);
  mySerial.begin(4800);
  pseudo_benchmark();
  Serial.println(buf);
}

void loop() // run over and over
{
  if (Serial.available()) {
    String data = Serial.readStringUntil('\n');
    mySerial.write('S'); // sending dummy date to start ATtiny85.
  }
  if (mySerial.available()) {
    Serial.write(mySerial.read());
  }
}

起動時にベンチマークのもととなる計算を実施。ソフトウェアシリアルを使って、ArduinoとATtiny85とを接続する。Arduinoに接続されたPCから何かを入力すると、ArduinoからATtiny85へコマンド('S')を送り、ATtiny85は結果をArduinoに返し、ArduinoはPCに計算結果を表示。

結果

ここで、ATtiny85のクロックは1MHz、Arduinoのクロックは16MHz。比較という視点では、ほぼ、相当する結果が得られているようだ。