Чтение/установка бита через bitWrite и bitRead

Тема в разделе "Arduino & Shields", создана пользователем DrProg, 4 сен 2015.

  1. DrProg

    DrProg Вечный нерд

    Думал, что прямые битовые операции выполняются быстрее чем стандартные, только вот почему это:
    Код (Text):
    bitWrite(mR, i, !(bitRead(masRG[s][i], 0)));
    оказалось быстрее чем вот это:
    Код (Text):
    setbit (mR, i, !(getbit(masRG[s][i], 0)));
    при:
    Код (Text):
    void setbit(byte &src, byte index, bool val) {
      if (val)
        src |= (1 << index);
      else
        src &= ~(1 << index);
    }
    bool getbit(byte src, byte index) {
      return src &= (1 << index);
    }
    Разница 10-12%. Самодельные функции не оптимизированы?
     
    ИгорьК нравится это.
  2. Unixon

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

    Погрешность измерения?
     
  3. DrProg

    DrProg Вечный нерд

    Какая погрешность? Один и тот же скетч гоняется несколько секунд в одном варианте и во втором, в первом получается 2310 кадров, во втором 2023 сколько ни гоняй.
     
    ИгорьК нравится это.
  4. DrProg

    DrProg Вечный нерд

    Такой вариант дал нечто среднее:
    Код (Text):
          mR = writeByte (mR, i, !(getByte(masRG[s][i], 0)));
    при:
    Код (Text):
    bool getByte (byte by, byte pos) {
      return by &= (1 << pos);
    }
    byte setByte (byte by, byte pos) {
      return by |= (1 << pos);
    }
    byte clearByte (byte by, byte pos) {
      return by &= ~(1 << pos);
    }
    byte writeByte (byte by, byte pos, bool bi) {
      if (bi) {
        return setByte(by, pos);
      } else {
        return clearByte(by, pos);
      }
    }
    Я то думал, что уже некуда короче. )
     
    ИгорьК нравится это.