以前、暇つぶしに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;
}
}