Измерение времени выполнения операций и функций в скетчах Arduino
Введение
При разработке проектов на Arduino важно знать, сколько времени занимает выполнение определённых операций или функций. Это помогает оптимизировать код, устранить задержки и повысить отзывчивость программы. Для этого в Arduino можно использовать функции millis() и micros(), которые возвращают время с момента запуска платы в миллисекундах или микросекундах соответственно.
Основные функции для измерения времени
millis()— возвращает количество миллисекунд, прошедших с момента запуска программы.micros()— возвращает количество микросекунд, прошедших с момента запуска программы.
Использование micros() полезно, когда нужно измерить очень короткие интервалы, например, в высокоскоростных алгоритмах.
Пример 1 — Измерение времени выполнения цикла
unsigned long startTime;
unsigned long endTime;
void setup() {
Serial.begin(9600);
}
void loop() {
startTime = millis(); // Запоминаем время начала
for (int i = 0; i < 1000; i++) {
int x = i * i;
}
endTime = millis(); // Запоминаем время конца
Serial.print("Время выполнения цикла: ");
Serial.print(endTime - startTime);
Serial.println(" мс");
delay(1000);
}
Пример 2 — Измерение времени выполнения функции
unsigned long startMicros;
unsigned long endMicros;
int heavyCalculation(int n) {
int sum = 0;
for (int i = 0; i < n; i++) {
sum += i;
}
return sum;
}
void setup() {
Serial.begin(9600);
}
void loop() {
startMicros = micros(); // Время начала в микросекундах
int result = heavyCalculation(5000);
endMicros = micros(); // Время конца
Serial.print("Результат: ");
Serial.print(result);
Serial.print(", время выполнения: ");
Serial.print(endMicros - startMicros);
Serial.println(" мкс");
delay(1000);
}
Пример 3 — Сравнение времени работы двух алгоритмов
unsigned long t1, t2;
void setup() {
Serial.begin(9600);
}
void loop() {
// Алгоритм 1
t1 = micros();
for (int i = 0; i < 1000; i++) {
int x = i * 2;
}
t2 = micros();
Serial.print("Алгоритм 1: ");
Serial.print(t2 - t1);
Serial.println(" мкс");
// Алгоритм 2
t1 = micros();
for (int i = 0; i < 1000; i++) {
int x = i << 1; // Быстрее за счет побитового сдвига
}
t2 = micros();
Serial.print("Алгоритм 2: ");
Serial.print(t2 - t1);
Serial.println(" мкс");
delay(2000);
}
Пример 4 — Измерение времени реакции на событие
В этом примере мы измерим время от нажатия кнопки до выполнения определённого действия:
int buttonPin = 2;
unsigned long pressTime;
void setup() {
Serial.begin(9600);
pinMode(buttonPin, INPUT_PULLUP);
}
void loop() {
if (digitalRead(buttonPin) == LOW) {
pressTime = millis();
while (digitalRead(buttonPin) == LOW); // Ждем отпускания
Serial.print("Время реакции: ");
Serial.print(millis() - pressTime);
Serial.println(" мс");
}
}
Заключение
Измерение времени выполнения кода — важный инструмент для отладки и оптимизации проектов Arduino. Используя millis() и micros(), можно находить узкие места в программе и улучшать её производительность.





