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

Понятно, что сейчас будет взрыв негодования , но все же …
Где взять код который подсчитает + - кол-во тактов которые затрачены процессором на блок с операциями ( пусть и примерно)
В интернете полно , я попробовал 4-6 штук разных в той или иной вариации
но гложат меня сомнения , что они считают , что нужно
пример кусок одно из наиболее приблеженных к действительным значениям

L1 = micros();
    L2 = micros()-L1;//Вычисление длительности пустой операции
    x1+=x1;//Операция для которой вычисляется количество тиков
    L3 = micros()-L1-L2;//Вычисление длительности операции
    L4 += L3;//Добавление длительности операции к счеткику общей длитильности

вроде как все правильно , все считается …ответ 64 тика , но

добавляю

L1 = micros();
    L2 = micros()-L1;//Вычисление длительности пустой операции
    x1+=x1;//Операция для которой вычисляется количество тиков
 x1+=x1;//Операция для которой вычисляется количество тиков
 x1+=x1;//Операция для которой вычисляется количество тиков
 x1+=x1;//Операция для которой вычисляется количество тиков
 x1+=x1;//Операция для которой вычисляется количество тиков
 x1+=x1;//Операция для которой вычисляется количество тиков
 x1+=x1;//Операция для которой вычисляется количество тиков
 x1+=x1;//Операция для которой вычисляется количество тиков
 x1+=x1;//Операция для которой вычисляется количество тиков
 x1+=x1;//Операция для которой вычисляется количество тиков

    L3 = micros()-L1-L2;//Вычисление длительности операции
    L4 += L3;//Добавление длительности операции к счеткику общей длитильности

ожидаю увидеть 64 * кол-во моих вставок… и оп - а так и осталось 64 ,
Сижу чешу репу , в чем прикол…

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

Компилятор оптимизирует. Через pragma можно ему указать на недопустимость такого поведения.

Да допустим …
а как же

 {
    L1 = micros();
    L2 = micros()-L1;//Вычисление длительности пустой операции
    x1+=x1;//Операция для которой вычисляется количество тиков
    int t=300;
    t=t/60;
    L3 = micros()-L1-L2;//Вычисление длительности операции
    L4 += L3;//Добавление длительности операции к счеткику общей длитильности
  }

теже 64 такта … Туто поведение нормальное

Усложним задачу

  {
    L1 = micros();
    L2 = micros()-L1;//Вычисление длительности пустой операции
    x1+=x1;//Операция для которой вычисляется количество тиков
    int t=300;
    t=t/60;
    for (int y=0;y<100;y++)t=t+1;
    L3 = micros()-L1-L2;//Вычисление длительности операции
    L4 += L3;//Добавление длительности операции к счеткику общей длитильности
  }

ответ не меняется
исходник ,

https://robocraft.ru/blog/677

но остальные программы также себя видут

да и еще , я конечно понимаю , что

for (int y=0;y<100;y++)t=t+1;

может оптимизировать и просто подставить t=100 ;

фиг с ним
а вот так

{
    L1 = micros();
    L2 = micros()-L1;//Вычисление длительности пустой операции
    x1+=x1;//Операция для которой вычисляется количество тиков
    int t=300;
    t=t/60;
    for (int y=0;y<100;y++)t=t+L2;
    L3 = micros()-L1-L2;//Вычисление длительности операции
    L4 += L3;//Добавление длительности операции к счеткику общей длитильности
  }

Откройте ассемблерный листинг, и посмотрите. Как получить листинг инструкций в инете много.

В авр есть таймеры, которые тактуются от того же источника, что и процессор.

1 лайк

Если про это - то у него такое же поведение .
деление и сложение даже Float занимает 0 мкс

Спойлер

// определение времени выполнения программного блока Ардуино

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);
}
Спойлер

Untitled project Copy - Wokwi Arduino and ESP32 Simulator

@romansochi , Вы читаете ответы или так, просто решили высказаться?
Прочитайте первый же ответ, если еще не прочитали, в нем содержится объяснение происходящему.
Вкратце: если Вы не используете результат какой-либо операции, то компилятор ее вырежет с чистой совестью.
Способ борьбы: например, распечатать результат исследуемой операции.
Есть и другие варианты.
Можете также ознакомиться:

1 лайк

Сделайте переменные volatile
volatile int g=0;
volatile float t=300;

А в целом.
Если вам нужно время выполнения используйте таймер он вас не обманывает. Или микрос (микрос с потерей точности).
Если вопрос Почему такое время - то смотрите листинг. И читайте про оптимизацию.

1 лайк

Так Вы на авр это делаете? Или на ESP32?