I've found it very useful over the past several months.
However, like all high level functions, it comes at a cost... timing...
I decided to see how much of a cost, and if there was anything I could do to reduce this cost.
Here are my results....
This is a typical diagnostic report for my distance ranging module. There are four Sharp Infrared Distance Sensors (one on each of front/rear/left/right) and there are two MaxBotix Ultrasound modules on a servo 180 degrees from one another. In this example, these give me Frontleft, Front, FrontRight, RearRight, Rear, RearLeft.
On an 8Mhz Arduino Pro Mini, this snippit takes 17ms to generate and send this report.Serial.print("StartTime with separate Serial.print statements = ");
Serial.println(test=millis());
Serial.print("Front: "); Serial.print(rangefront[midpoint]);
Serial.print(" Rear: "); Serial.print(rangerear[midpoint]);
Serial.print(" Left: "); Serial.print(rangeleft[midpoint]);
Serial.print(" Right: "); Serial.print(rangeright[midpoint]);
Serial.print(" Front Sonar: "); Serial.print(FrontSonar[midpoint]/58);
Serial.print(" Rear Sonar: "); Serial.print(RearSonar[midpoint]/58);
Serial.print("FrontLeft: "); Serial.print(FrontLeft);
Serial.print(" FrontRight: "); Serial.print(FrontRight);
Serial.print(" Front: "); Serial.print(Front);
Serial.print(" RearLeft: "); Serial.print(RearLeft);
Serial.print(" RearRight: "); Serial.print(RearRight);
Serial.print(" Rear: "); Serial.println(Rear);
Serial.print("EndTime with separate Serial.print statements = ");
Serial.println(millis()-test);
But what if I used string concatenation, and only sent ONE string our Serial like this?
On an 8Mhz Arduino Pro Mini, this snippit only takes 6ms to generate and send this report.Serial.print("StartTime with one Serial.print statement and concat strings = ");
Serial.println(test=millis());
// Assemble the string first, then print it once.
response = ""; // Flush previous message.
response += " Front: "; response += rangefront[midpoint];
response += " Rear: "; response += rangerear[midpoint];
response += " Left: "; response += rangeleft[midpoint];
response += " Right: "; response += rangeright[midpoint];
response += " Front Sonar: "; response += FrontSonar[midpoint]/58;
response += " Rear Sonar: "; response += RearSonar[midpoint]/58;
response += " FrontLeft: "; response += FrontLeft;
response += " FrontRight: "; response += FrontRight;
response += " Front: "; response += Front;
response += " RearLeft: "; response += RearLeft;
response += " RearRight: "; response += RearRight;
response += " Rear: "; response += Rear;
Serial.println(response);
Serial.print("EndTime with one Serial.print statement and concat strings = ");
Serial.println(millis()-test);
And before you ask why I don't just serially concatenate in one statement... the Arduino IDE doesn't seem to support that, at least not for mixed data types.
Can I do any better? What if I reduces the TEXT portion to just comma separators, and only sent ONE string our Serial like this?
On an 8Mhz Arduino Pro Mini, this snippit now only takes between 3-4ms to generate and send this report.Serial.print("StartTime with no filler and concat strings = ");
Serial.println(test=millis());
// Assemble the string first, then print it once.
response = ""; // Flush previous message.
response += rangefront[midpoint]; response += ", ";
response += rangerear[midpoint]; response += ", ";
response += rangeleft[midpoint]; response += ", ";
response += rangeright[midpoint]; response += ", ";
response += FrontSonar[midpoint]/58; response += ", ";
response += RearSonar[midpoint]/58; response += ", ";
response += FrontLeft; response += ", ";
response += FrontRight; response += ", ";
response += Front; response += ", ";
response += RearLeft; response += ", ";
response += RearRight; response += ", ";
response += Rear;
Serial.println(response);
Serial.print("EndTime with no filler and concat strings = ");
Serial.println(millis()-test);
This is a significant improvement, and reduces the overall impact diagnostics has on my loop timing....
Hope you find this helpful...
No comments:
Post a Comment