Сколько времени уходит на if{} ? ;)

Тема в разделе "Arduino & Shields", создана пользователем Gomez, 28 сен 2018.

  1. Gomez

    Gomez Гик

    Намеренно несерьезно назвал тему, хоть вопрос действительно на эту тему.

    Иногда при обработке какой-то функции в loop{} нужно дать задержку delay(1).
    Например,
    Код (C++):
    void loop() {
      server.handleClient();
      delay(1);
    }
    Но что, если у меня в loop еще есть какие-то инструкции, например, вызов функции, слушающей serial, или банальный
    Код (C++):
    if(x==1)
      server.handleClient();
     
    Это стоит 1 миллисекунды? Или наиболее логичный ответ "оставь этот несчастный delay(1) - не ошибешься?" :)
     
  2. DIYMan

    DIYMan Guest

    Нет. Сама проверка if() - в вырожденном приведённом случае - не стОит, а вот то, что в блоке, который исполняется по выполнению условия - может занять и вечность. Короче - всё зависит от конкретики.

    Да.
     
    Gomez нравится это.
  3. parovoZZ

    parovoZZ Гуру

    мне кажется, что при включенной оптимизации компилятор опустит проверку условия
    Код (C++):
    x==1
     
    Mitrandir нравится это.
  4. DIYMan

    DIYMan Guest

    С чего бы это, если x - не константа?
     
  5. Mitrandir

    Mitrandir Гуру

    Компилятор не дурак. Он сечет что х не меняется

    Под рукой нет компилятора не могу проверить
    Но имхо он и этот иф уберет
    Код (C++):
    If ( ++х-- > 0)
     
  6. Стоит три цикла. Цикл это 1 секунда/частота мк. Для уно три цикла это 187,5 нс.
    Компилятор ардуино не оптимизирует ничего по умолчанию.
     
  7. DIYMan

    DIYMan Guest

    Да с чего вы взяли, что он не меняется? Автор где-то писал, что он не меняется? Зачем додумывать недодумываемое? Я вот говорю, что по вводным автора - ошибкой будет судить, что компилятор выкинет проверку. Ибо, навскидку:

    Код (C++):
    int x = 1;

    void setup()
    {
        int k = analogRead(A0);
        if(!(k%2))
            x = 100;
    }
    void loop()
    {
        if(x == 1)
            server.handleClient();
    }
    У нас компилятор настолько умный, чтобы до закачивания в плату предугадать, что на выходе с A0 будет чётное число? Или - он в половине случаем выкинет, а в половине - оставит условие?

    А теперь перечитываем внимательно стартовый топик и пытаемся найти, где там хотя бы намёк на то, что x - константа времени компиляции?
     
  8. parovoZZ

    parovoZZ Гуру

    в данном случае всё содержимое loop будет выкинуто, ибо не исполнится никогда.
    Уровень o2 стоит вроде)) Кошак придет - расскажет.
     
  9. parovoZZ

    parovoZZ Гуру

    Автор ничего не писал. Но судя по первым строчкам кода, данный цикл должен выполняться всегда.
    Но если уж совсем придираться, то данный код вообще не скомпилируется, ибо переменные не инициализированы.
     
  10. SergeiL

    SergeiL Оракул Модератор

    Как всегда резко и бездоказательно! :) По умолчанию -Os стоит.
     
    parovoZZ нравится это.
  11. Gomez

    Gomez Гик

    x - не константа, конечно, а флажок - выполняем это кусок в loop{} в данный отрезок времени, или выполняем какие-то другие иструкции в loop{}. Ну пусть не "x", а "mode", например.
    Но я понял, что простые if, если там не digitalRead(), к примеру, займут очень мало процессорного времени. :)

    У меня еще в loop всегда выполняется Вам слегка знакомый ;) cParser.update(); (спасибо за него еще раз)
     
    DIYMan и Mitrandir нравится это.
  12. Ок. Был не прав. Не стесняйте поправлять, когда есть что поправить, а не как обычно.
     
  13. Mitrandir

    Mitrandir Гуру

    А с каких пор переменные должны быть инициализированы в с?
     
  14. parovoZZ

    parovoZZ Гуру

    Что такое х, что такое server? Компилятор обязательно поинтересуется.
     
  15. Daniil

    Daniil Гуру

    Если хотите больше конкретики, то лучше ознакомиться с терминами.
    И нагуглить ассемблер.
    Напишите код в атмел студио (можно на си) и посмотрите во что превратит ваш код компилятор.
    В ассемблере есть операции сравнения, они могут выполняться за 1 такт (не помню точно, но некоторым операциям надо больше времени).
    НО ассемблерное сравнение работает только с одним числом (может быть с двумя, не помню). Обычно, сравнение проводится с нулём. А вот как преобразовать то, что вы написали в if в сравнение с нулем будет думать компилятор.
     
    SergeiL и Mitrandir нравится это.
  16. DIYMan

    DIYMan Guest

    Уже и не помню :) Но - пожалуйста, по-любому ;)
     
    Gomez нравится это.
  17. SergeiL

    SergeiL Оракул Модератор

    Не хочу повторяться, но когда то, я внезапно попал, давно, в "отдел операционных систем".
    Тогда все писали на асме. Мы занимались внедрением Си в нашу МOS. 10 лет там проработал.
    Писали на Си, отлаживались на Асме.
    Если анализировать результаты компиляции Си, в код (Асм), начинаешь понимать, и писать правильно на Си.
    Без лишних операций, и без использования лишних регистров.
     
    parovoZZ и Daniil нравится это.
  18. SergeiL

    SergeiL Оракул Модератор

    Через какое-то время, смотря на асм, начинаешь легко видеть Си код в асме - if, for while...
     
    Mitrandir и Gomez нравится это.
  19. Gomez

    Gomez Гик

    Я понимаю и завидую. Это как думать (хотя бы иногда) на другом языке, кроме родного, когда знание и применение этого языка из количества переходит в качество. :cool:
     
  20. SergeiL

    SergeiL Оракул Модератор

    К сожалению, это все в прошлом. :(
    В отличии от Си, Асм - сильно зависит от платформы. Для каждой архитектуры свои регистры, свои правила.
    В этом-то и прелесть Си.