/*
* Testing how much a modulus operation can delay time based
* operation of Arduino.
*
* Modulus is slow, so including it in calculations using
* millis() prior to setting your prevMillis = millis() for
* incremental time keeping can slow things down
*
* // The wrong way
* something = (millis() - prevMillis) % something_else;
* // long operation happend before we set prevMillis... DELAY
* prevMillis = millis();
* // The right way
* increment = millis() - prevMillis;
* prevMillis = millis();
* // long operation happens after we have set prevMillis
* something = increment % something_else;
*
* The times I get in my code are:
* with % operation: 1332ms
* sans % operation: 165ms
*/
unsigned long int millisSinceStart = 0;
unsigned long int prevMillis = 0;
void setup() {
Serial.begin(9600);
}
void loop() {
unsigned long int start = millis();
unsigned long int finish;
// Caculate how many milliseconds since Arduino was reset
// rolling over every 24 hours (used in clock program)
for (int i = 0 ; i < 32000 ; i++ ) {
millisSinceStart =
(millisSinceStart + millis() - prevMillis) % 86400000;
prevMillis = millis();
}
finish = millis();
Serial.print("Calculation with % operation: ");
Serial.println(finish - start);
// Same without modulus operation (no rollover - will last
// for 49.5 days then rollover to 0.
start = millis();
for (int i = 0 ; i < 32000 ; i++ ) {
millisSinceStart =
(millisSinceStart + millis() - prevMillis);
prevMillis = millis();
}
finish = millis();
Serial.print("Calculation sans % operation: ");
Serial.println(finish - start);
}
Comments