Измерение скорости выполнения кода
- Войдите на сайт для отправки комментариев
Пт, 04/06/2021 - 13:39
Всем привет! Задался целью узнать сколько времени выполняется тот или иной участок кода. В сети нашел пример такой программы:
http://mypractic-forum.ru/viewtopic.php?t=17
вот код программы:
// определение времени выполнения программного блока Ардуино unsigned int timerValue; // значение таймера void setup() { Serial.begin(9600); // инициализируем последовательный порт, скорость 9600 // установки таймера 1 TCCR1A = 0; TCCR1B = 0; } void loop() { noInterrupts(); // запрет прерываний TCNT1H = 0; // сброс таймера TCNT1L = 0; TCCR1B = 1; // разрешение работы таймера // ---------- исследуемый программный блок --------- // ------------------------------------------------- TCCR1B = 0; // остановка таймера timerValue = (unsigned int)TCNT1L | ((unsigned int)TCNT1H << 8); // чтение таймера interrupts(); // разрешение прерываний // вывод на компьютер Serial.print( (float)(timerValue - 2) * 0.0625); Serial.println(" mks"); delay(500); }
Я решил узнать сколько времени уходит на выполнение небольшого кода:
int r = 0; r = r + 37; if (r > 400) { r = 400; }
но на выходе получаю нули: 0.00 mks
Можете подсказать почему не подсчитывается время выполнения?
код из одних констант и результат нигде не используется - в итоге оптимизатор его полностью выкидывает из скетча как бесполезный
Сейчас проверил, если убрать объявление переменной
int
r = 0;
и сделать объявление в начале скетча то тогда код выполняется. Хм.. Похоже не не переваривает объявление переменных. Странно. Элементарный цикл for тоже не работает и пропускается. Ну а вот этот код:
выполняется 1.12 mks
А ПОЧИТАТЬ - как работают с таймером влом? Типа только отца и мать надо ПОЧИТАТЬ?
Почитайте про прерывания...
Я время выполнения кода считал так:
http://arduino.ru/Reference/Micros
Считываем переменную micros() вначале нужного кода. Затем считываем эту переменную в конце кода. Находим разницу между этими переменными. Это и будет примерное время измерения кода в микросекундах.
Например вывод на индикатор по шине I2C в 8 раз медленнее чем по параллельной 8 битной шине. Чем меньше число выводимое на дисплей, тем меньше времени вывода.
Простейшие операции (сложение вычитание сравнение) для битовых и байтовых переменных - 1 такт. Для целых чисел- 2 такта. Для Long чисел - 4 такта. для Float несколько десятков тактов. Умножение и деление - несколько сотен тактов.
Чем меньше число выводимое на дисплей, тем меньше времени вывода.
Круто!
А во сколько раз вывод девятки больше, чем вывод нуля?
Простейшие операции (сложение вычитание сравнение) для битовых и байтовых переменных - 1 такт. Для целых чисел- 2 такта. Для Long чисел - 4 такта.
При условии, что нужные числа уже лежат в регистрах. В случае простейших операций загрузка/выгрузка нередко занимают больше времени, чем, собственно, сама операция.
А вообще, советую заглянуть в тему: http://arduino.ru/forum/obshchii/vremya-vypolneniya-otdelnykh-komand-arduino
Чем меньше число выводимое на дисплей, тем меньше времени вывода.
Круто!
Да. Потому двоичная систем а самая распространенная, как самая быстрая. А десятичная медленная, вот люди и считают медленно.