Измерение скорости выполнения кода

forfrends
Offline
Зарегистрирован: 24.02.2015

Всем привет! Задался целью узнать сколько времени выполняется тот или иной участок кода. В сети нашел пример такой программы: 

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

Можете подсказать почему не подсчитывается время выполнения? 
b707
Offline
Зарегистрирован: 26.05.2017

forfrends пишет:

Можете подсказать почему не подсчитывается время выполнения? 

код из одних констант и результат нигде не используется - в итоге оптимизатор его полностью выкидывает из скетча как бесполезный

forfrends
Offline
Зарегистрирован: 24.02.2015

Сейчас проверил, если убрать объявление переменной

int r = 0;

и сделать объявление в начале скетча то тогда код выполняется. Хм.. Похоже не не переваривает объявление переменных. Странно. Элементарный цикл for тоже не работает и пропускается. Ну а вот этот код:

r = r + 37;
if (r > 400)
{
    r = 400;
}

выполняется 1.12 mks

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

А ПОЧИТАТЬ - как работают с таймером влом? Типа только отца и мать надо ПОЧИТАТЬ?

Почитайте про прерывания...

Buldakov
Offline
Зарегистрирован: 17.01.2016

Я время выполнения кода считал так:

http://arduino.ru/Reference/Micros

Считываем переменную micros() вначале нужного кода. Затем считываем эту переменную в конце кода. Находим разницу между этими переменными. Это и будет примерное время измерения кода в микросекундах.

Например вывод на индикатор по шине I2C  в 8 раз медленнее чем по параллельной 8 битной шине. Чем меньше число выводимое на дисплей, тем меньше времени вывода.

Простейшие операции (сложение вычитание сравнение) для битовых и байтовых переменных - 1 такт. Для целых чисел- 2 такта. Для Long чисел - 4 такта. для Float несколько десятков тактов. Умножение и деление - несколько сотен тактов.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Buldakov пишет:

Чем меньше число выводимое на дисплей, тем меньше времени вывода.

Круто!

А во сколько раз вывод девятки больше, чем вывод нуля?

Цитата:

Простейшие операции (сложение вычитание сравнение) для битовых и байтовых переменных - 1 такт. Для целых чисел- 2 такта. Для Long чисел - 4 такта.

При условии, что нужные числа уже лежат в регистрах. В случае простейших операций загрузка/выгрузка нередко занимают больше времени, чем, собственно, сама операция.

А вообще, советую заглянуть в тему: http://arduino.ru/forum/obshchii/vremya-vypolneniya-otdelnykh-komand-arduino

Logik
Offline
Зарегистрирован: 05.08.2014

andriano пишет:

Buldakov пишет:

Чем меньше число выводимое на дисплей, тем меньше времени вывода.

Круто!

Да. Потому двоичная систем а самая распространенная,  как самая быстрая. А десятичная медленная, вот люди и считают медленно.