ページ

2012-01-31

[arduino]Arduinoの性能測定

以前、暇つぶしにArduinoの性能測定をしたことがあります。

その時のコードが以下になります。


時間があったら、測定結果をまとめてみたいと思います。



/*
  Arduino Mega向け性能テストコード
 */
#undef AD_TEST
#undef SIN_TEST
#undef SIN_TEST_SINGLE
#undef CALC_MULTI_I
#undef CALC_MULTI_F
#undef CALC_MULTI_D
#undef CALC_MULTI_L
#undef CACL_ADD_I
#undef CACL_ADD_L
#undef CACL_ADD_F
#undef CACL_ADD_D

long startTime = 0;
long endTime = 0;

int randValueI;
long randValueL;
float randValueF;
double randValueD;

void setup() {
  Serial.begin(115200);
  randomSeed(analogRead(A0));
  randValueI = random(1,100);
  randValueL = random(1,1000);
  randValueF = (float) random(1,100) / random(1,50 );
  randValueD = (float) random(1,100) / random(1,50 );
  Serial.print("randValueI = ");
  Serial.println(randValueI); 
  Serial.print("randValueL = ");
  Serial.println(randValueL);
  Serial.print("randValueF = ");
  Serial.println(randValueF);
  Serial.print("randValueD = ");
  Serial.println(randValueD);
}

void loop() {
  startTime = micros();

#ifdef AD_TEST
  updateAdValues();
#endif /* AD_TEST */

#ifdef SIN_TEST
  calcSin();
#endif /* SIN_TEST */

#ifdef SIN_TEST_SINGLE
  calcSinSingle();
#endif /* SIN_TEST_SINGLE */

#ifdef CALC_MULTI_I
  calcMultiplicationI();
#endif /* CALC_MULTI_I */

#ifdef CALC_MULTI_F
  calcMultiplicationF();
#endif /* CALC_MULTI_F */

#ifdef CALC_MULTI_D
  calcMultiplicationD();
#endif /* CALC_MULTI_D */

#ifdef CALC_MULTI_L
  calcMultiplicationL();
#endif /* CALC_MULTI_L */

#ifdef CACL_ADD_I
  calcAddI();
#endif /* CACL_ADD_I */

#ifdef CACL_ADD_L
  calcAddL();
#endif /* CACL_ADD_L */

#ifdef CACL_ADD_F
  calcAddF();
#endif /* CACL_ADD_F */

#ifdef CACL_ADD_D
  calcAddD();
#endif /* CACL_ADD_D */

  endTime = micros();

  Serial.print("Time = ");
  Serial.print(endTime - startTime);  
  Serial.println(" [usec]");

}


/* 全チャンネルAD変換 ここから */
const int AD_PORT_NUM = 16;
const int AD_PORT_INDEX[] = { 
  A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7,
  A8 , A9 , A10, A11, A12, A13, A14, A15 };
int adValues[AD_PORT_NUM] = {
  0};
void updateAdValues(){
  for( int i = 0; i < AD_PORT_NUM; i++ ){
    adValues[i] = analogRead(AD_PORT_INDEX[i]);
  }
}

/* 全チャンネルAD変換 ここまで */

/* sinの計算 ここから*/
/* 1回*/
double sinValue = 0.0;
void calcSinSingle(){
  sinValue = sin(0.5);
}
/* sinの計算 ここまで*/

/* sinの計算 ここから*/
/* 0.0-3.14まで314回*/
void calcSin(){
  for( float f = 0.0; f < 3.14; f += 0.01 ){
    sinValue = sin(f);
  }
}
/* sinの計算 ここまで*/

/* 掛け算 10000回*/
int calcMultiValueI = 0;
void calcMultiplicationI(){
  for( int i = 0; i < 10000; i++ ){
    calcMultiValueI = randValueI * i;
  }
}

long calcMultiValueL = 0;
void calcMultiplicationL(){
  for( int i = 0; i < 10000; i++ ){
    calcMultiValueL = randValueL * i;
  }
}

float calcMultiValueF = 0.0;
void calcMultiplicationF(){
  for( int i = 0; i < 10000; i++ ){
    calcMultiValueF = randValueF * i;
  }
}

double calcMultiValueD = 0.0;
void calcMultiplicationD(){
  for( int i = 0; i < 10000; i++ ){
    calcMultiValueD = randValueD * i;
  }
}


/* 足し算 10000回 */
int calcAddValueI = 0;
void calcAddI(){
  for( int i = 0; i < 10000; i++ ){
    calcAddValueI = randValueI + i;
  }
}

long calcAddValueL = 0;
void calcAddL(){
  for( int i = 0; i < 10000; i++ ){
    calcAddValueL = randValueL + i;
  }
}

float calcAddValueF = 0.0;
void calcAddF(){
  for( int i = 0; i < 10000; i++ ){
    calcAddValueF = randValueF + i;
  }
}

double calcAddValueD = 0.0;
void calcAddD(){
  for( int i = 0; i < 10000; i++ ){
    calcAddValueD = randValueD + i;
  }
}






0 件のコメント:

コメントを投稿