void setup() { while(!Serial); delay(100); SpeedTest(); } void loop() { } void SpeedTest(void) { register int i,j; int p,q,r; volatile int v; unsigned long m,n; double d, overhead; char buffer[30]; Serial.println(F("")); Serial.println(F("Speed test")); Serial.println(F("----------")); Serial.print(F("F_CPU = ")); Serial.print(F_CPU,DEC); Serial.println(F(" Hz")); Serial.print(F("1/F_CPU = ")); Serial.print((1000000.0/(double)F_CPU),4); Serial.println(F(" us")); Serial.println(F("The next tests are runtime compensated for overhead")); Serial.print(F(" nop : ")); m=millis(); for (i=0; i<100; i++) { for (j=0; j<10000; j++) { asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); } } n=millis(); d = ((double)n - (double)m) / ((double)i * (double)j); d *= 1000.0; // in micro seconds // Calculate overhead with 'nop' instruction per loop in microseconds overhead = d - (20.0 * (1000000.0/(double)F_CPU)); d -= overhead; d /= 20.0; // per instruction Serial.print (d,3); Serial.println (F(" us")); Serial.print(F(" avr gcc I/O : ")); m=millis(); for (i=0; i<50; i++) { for (j=0; j<10000; j++) { // Use system led PORTB |= _BV(PORTB5); PORTB &= ~_BV(PORTB5); PORTB |= _BV(PORTB5); PORTB &= ~_BV(PORTB5); PORTB |= _BV(PORTB5); PORTB &= ~_BV(PORTB5); PORTB |= _BV(PORTB5); PORTB &= ~_BV(PORTB5); PORTB |= _BV(PORTB5); PORTB &= ~_BV(PORTB5); PORTB |= _BV(PORTB5); PORTB &= ~_BV(PORTB5); PORTB |= _BV(PORTB5); PORTB &= ~_BV(PORTB5); PORTB |= _BV(PORTB5); PORTB &= ~_BV(PORTB5); PORTB |= _BV(PORTB5); PORTB &= ~_BV(PORTB5); PORTB |= _BV(PORTB5); PORTB &= ~_BV(PORTB5); } } n=millis(); d = ((double)n - (double)m) / ((double)i * (double)j); d *= 1000.0; d -= overhead; d /= 20.0; Serial.print (d,3); Serial.println (F(" us")); Serial.print(F(" Arduino digitalRead : ")); m=millis(); for (i=0; i<2; i++) { for (j=0; j<10000; j++) { digitalRead(13); digitalRead(13); digitalRead(13); digitalRead(13); digitalRead(13); digitalRead(13); digitalRead(13); digitalRead(13); digitalRead(13); digitalRead(13); digitalRead(13); digitalRead(13); digitalRead(13); digitalRead(13); digitalRead(13); digitalRead(13); digitalRead(13); digitalRead(13); digitalRead(13); digitalRead(13); } } n=millis(); d = ((double)n - (double)m) / ((double)i * (double)j); d *= 1000.0; d -= overhead; d /= 20.0; Serial.print (d,3); Serial.println (F(" us")); Serial.print(F(" Arduino digitalWrite : ")); m=millis(); for (i=0; i<2; i++) { for (j=0; j<10000; j++) { digitalWrite(13, HIGH); digitalWrite(13, LOW); digitalWrite(13, HIGH); digitalWrite(13, LOW); digitalWrite(13, HIGH); digitalWrite(13, LOW); digitalWrite(13, HIGH); digitalWrite(13, LOW); digitalWrite(13, HIGH); digitalWrite(13, LOW); digitalWrite(13, HIGH); digitalWrite(13, LOW); digitalWrite(13, HIGH); digitalWrite(13, LOW); digitalWrite(13, HIGH); digitalWrite(13, LOW); digitalWrite(13, HIGH); digitalWrite(13, LOW); digitalWrite(13, HIGH); digitalWrite(13, LOW); } } n=millis(); d = ((double)n - (double)m) / ((double)i * (double)j); d *= 1000.0; d -= overhead; d /= 20.0; Serial.print (d,3); Serial.println (F(" us")); Serial.print(F(" pinMode : ")); m=millis(); for (i=0; i<2; i++) { for (j=0; j<10000; j++) { pinMode(13, INPUT); pinMode(13, OUTPUT); pinMode(13, INPUT); pinMode(13, OUTPUT); pinMode(13, INPUT); pinMode(13, OUTPUT); pinMode(13, INPUT); pinMode(13, OUTPUT); pinMode(13, INPUT); pinMode(13, OUTPUT); pinMode(13, INPUT); pinMode(13, OUTPUT); pinMode(13, INPUT); pinMode(13, OUTPUT); pinMode(13, INPUT); pinMode(13, OUTPUT); pinMode(13, INPUT); pinMode(13, OUTPUT); pinMode(13, INPUT); pinMode(13, OUTPUT); } } n=millis(); d = ((double)n - (double)m) / ((double)i * (double)j); d *= 1000.0; d -= overhead; d /= 20.0; Serial.print (d,3); Serial.println (F(" us")); Serial.print(F(" multiply volatile byte : ")); volatile unsigned char c1,c2; c1 = 2; c2 = 3; m=millis(); for (i=0; i<10; i++) { for (j=0; j<10000; j++) { c1 *= c2; c1 *= c2; c1 *= c2; c1 *= c2; c1 *= c2; c1 *= c2; c1 *= c2; c1 *= c2; c1 *= c2; c1 *= c2; c1 *= c2; c1 *= c2; c1 *= c2; c1 *= c2; c1 *= c2; c1 *= c2; c1 *= c2; c1 *= c2; c1 *= c2; c1 *= c2; } } n=millis(); d = ((double)n - (double)m) / ((double)i * (double)j); d *= 1000.0; d -= overhead; d /= 20.0; Serial.print (d,3); Serial.println (F(" us")); Serial.print(F(" divide volatile byte : ")); // volatile unsigned char c1,c2; c1 = 253; c2 = 3; m=millis(); for (i=0; i<1; i++) { for (j=0; j<10000; j++) { c1 /= c2; c1 /= c2; c1 /= c2; c1 /= c2; c1 /= c2; c1 /= c2; c1 /= c2; c1 /= c2; c1 /= c2; c1 /= c2; c1 /= c2; c1 /= c2; c1 /= c2; c1 /= c2; c1 /= c2; c1 /= c2; c1 /= c2; c1 /= c2; c1 /= c2; c1 /= c2; } } n=millis(); d = ((double)n - (double)m) / ((double)i * (double)j); d *= 1000.0; d -= overhead; d /= 20.0; Serial.print (d,3); Serial.println (F(" us")); Serial.print(F(" multiply volatile integer : ")); volatile int x,y; x = 2; y = 3; m=millis(); for (i=0; i<10; i++) { for (j=0; j<10000; j++) { x *= y; x *= y; x *= y; x *= y; x *= y; x *= y; x *= y; x *= y; x *= y; x *= y; x *= y; x *= y; x *= y; x *= y; x *= y; x *= y; x *= y; x *= y; x *= y; x *= y; } } n=millis(); d = ((double)n - (double)m) / ((double)i * (double)j); d *= 1000.0; d -= overhead; d /= 20.0; Serial.print (d,3); Serial.println (F(" us")); Serial.print(F(" divide volatile integer : ")); // volatile int x,y; x = 31415; y = 3; m=millis(); for (i=0; i<1; i++) { for (j=0; j<10000; j++) { x /= y; x /= y; x /= y; x /= y; x /= y; x /= y; x /= y; x /= y; x /= y; x /= y; x /= y; x /= y; x /= y; x /= y; x /= y; x /= y; x /= y; x /= y; x /= y; x /= y; } } n=millis(); d = ((double)n - (double)m) / ((double)i * (double)j); d *= 1000.0; d -= overhead; d /= 20.0; Serial.print (d,3); Serial.println (F(" us")); Serial.print(F(" multiply volatile long : ")); volatile long l1,l2; l1 = 2; l2 = 3; m=millis(); for (i=0; i<2; i++) { for (j=0; j<10000; j++) { l1 *= l2; l1 *= l2; l1 *= l2; l1 *= l2; l1 *= l2; l1 *= l2; l1 *= l2; l1 *= l2; l1 *= l2; l1 *= l2; l1 *= l2; l1 *= l2; l1 *= l2; l1 *= l2; l1 *= l2; l1 *= l2; l1 *= l2; l1 *= l2; l1 *= l2; l1 *= l2; } } n=millis(); d = ((double)n - (double)m) / ((double)i * (double)j); d *= 1000.0; d -= overhead; d /= 20.0; Serial.print (d,3); Serial.println (F(" us")); Serial.print(F(" multiply single float : ")); volatile float f1,f2; f1 = 3.24; f2 = 1.25; m=millis(); for (i=0; i<2; i++) { for (j=0; j<10000; j++) { f1 *= f2; f1 *= f2; f1 *= f2; f1 *= f2; f1 *= f2; f1 *= f2; f1 *= f2; f1 *= f2; f1 *= f2; f1 *= f2; f1 *= f2; f1 *= f2; f1 *= f2; f1 *= f2; f1 *= f2; f1 *= f2; f1 *= f2; f1 *= f2; f1 *= f2; f1 *= f2; } } n=millis(); d = ((double)n - (double)m) / ((double)i * (double)j); d *= 1000.0; d -= overhead; d /= 20.0; Serial.print (d,3); Serial.println (F(" us")); Serial.print(F(" multiply double float : ")); volatile double d1,d2; d1 = 3.24; d2 = 1.25; m=millis(); for (i=0; i<2; i++) { for (j=0; j<10000; j++) { d1 *= d2; d1 *= d2; d1 *= d2; d1 *= d2; d1 *= d2; d1 *= d2; d1 *= d2; d1 *= d2; d1 *= d2; d1 *= d2; d1 *= d2; d1 *= d2; d1 *= d2; d1 *= d2; d1 *= d2; d1 *= d2; d1 *= d2; d1 *= d2; d1 *= d2; d1 *= d2; } } n=millis(); d = ((double)n - (double)m) / ((double)i * (double)j); d *= 1000.0; d -= overhead; d /= 20.0; Serial.print (d,3); Serial.println (F(" us")); Serial.print(F(" divide double float : ")); // volatile double d1,d2; d1 = 312645.24; d2 = 1.21; m=millis(); for (i=0; i<1; i++) { for (j=0; j<2000; j++) { d1 /= d2; d1 /= d2; d1 /= d2; d1 /= d2; d1 /= d2; d1 /= d2; d1 /= d2; d1 /= d2; d1 /= d2; d1 /= d2; d1 /= d2; d1 /= d2; d1 /= d2; d1 /= d2; d1 /= d2; d1 /= d2; d1 /= d2; d1 /= d2; d1 /= d2; d1 /= d2; } } n=millis(); d = ((double)n - (double)m) / ((double)i * (double)j); d *= 1000.0; d -= overhead; d /= 20.0; Serial.print (d,3); Serial.println (F(" us")); Serial.print(F(" itoa() : ")); m=millis(); for (i=0; i<1; i++) { for (j=0; j<10000; j++) { itoa(i,buffer,10); itoa(i,buffer,10); itoa(i,buffer,10); itoa(i,buffer,10); itoa(i,buffer,10); itoa(i,buffer,10); itoa(i,buffer,10); itoa(i,buffer,10); itoa(i,buffer,10); itoa(i,buffer,10); itoa(i,buffer,10); itoa(i,buffer,10); itoa(i,buffer,10); itoa(i,buffer,10); itoa(i,buffer,10); itoa(i,buffer,10); itoa(i,buffer,10); itoa(i,buffer,10); itoa(i,buffer,10); itoa(i,buffer,10); } } n=millis(); d = ((double)n - (double)m) / ((double)i * (double)j); d *= 1000.0; d -= overhead; d /= 20.0; Serial.print (d,3); Serial.println (F(" us")); long int l = 314159L; Serial.print(F(" ltoa() : ")); m=millis(); for (i=0; i<1; i++) { for (j=0; j<500; j++) { ltoa(l,buffer,10); ltoa(l,buffer,10); ltoa(l,buffer,10); ltoa(l,buffer,10); ltoa(l,buffer,10); ltoa(l,buffer,10); ltoa(l,buffer,10); ltoa(l,buffer,10); ltoa(l,buffer,10); ltoa(l,buffer,10); ltoa(l,buffer,10); ltoa(l,buffer,10); ltoa(l,buffer,10); ltoa(l,buffer,10); ltoa(l,buffer,10); ltoa(l,buffer,10); ltoa(l,buffer,10); ltoa(l,buffer,10); ltoa(l,buffer,10); ltoa(l,buffer,10); } } n=millis(); d = ((double)n - (double)m) / ((double)i * (double)j); d *= 1000.0; d -= overhead; d /= 20.0; Serial.print (d,3); Serial.println (F(" us")); Serial.print(F(" dtostrf() : ")); double d3; d3 = 3.14159265; m=millis(); for (i=0; i<2; i++) { for (j=0; j<1000; j++) { dtostrf (d3, 6, 2, buffer); dtostrf (d3, 6, 2, buffer); dtostrf (d3, 6, 2, buffer); dtostrf (d3, 6, 2, buffer); dtostrf (d3, 6, 2, buffer); dtostrf (d3, 6, 2, buffer); dtostrf (d3, 6, 2, buffer); dtostrf (d3, 6, 2, buffer); dtostrf (d3, 6, 2, buffer); dtostrf (d3, 6, 2, buffer); dtostrf (d3, 6, 2, buffer); dtostrf (d3, 6, 2, buffer); dtostrf (d3, 6, 2, buffer); dtostrf (d3, 6, 2, buffer); dtostrf (d3, 6, 2, buffer); dtostrf (d3, 6, 2, buffer); dtostrf (d3, 6, 2, buffer); dtostrf (d3, 6, 2, buffer); dtostrf (d3, 6, 2, buffer); dtostrf (d3, 6, 2, buffer); } } n=millis(); d = ((double)n - (double)m) / ((double)i * (double)j); d *= 1000.0; d -= overhead; d /= 20.0; Serial.print (d,3); Serial.println (F(" us")); Serial.print(F(" random() : ")); m=millis(); for (i=0; i<2; i++) { for (j=0; j<1000; j++) { r=random(); r=random(); r=random(); r=random(); r=random(); r=random(); r=random(); r=random(); r=random(); r=random(); r=random(); r=random(); r=random(); r=random(); r=random(); r=random(); r=random(); r=random(); r=random(); r=random(); } } n=millis(); d = ((double)n - (double)m) / ((double)i * (double)j); d *= 1000.0; d -= overhead; d /= 20.0; Serial.print (d,3); Serial.println (F(" us")); Serial.print(F(" y |= (1<