1. C# / Говнокод #2660

    +966.3

    1. 1
    2. 2
    int factor = (chbFactor.Checked) ? 1 : 0; // bool to int
    factor = (factor * 2) - 1; // -1 or +1

    Вторая строчка превращает 0 в -1 а единичку не трогает

    Запостил: Vidmak, 24 Февраля 2010

    Комментарии (23) RSS

    • ох уж эти индусы
      Ответить
    • зато нет условных переходов в коде...
      не говнокод...
      Ответить
      • Т.е. вот так
        int factor = (chbFactor.Checked) ? 1 : -1; говнокод? :)
        Ответить
      • А почему бы сразу не писать так:
        int factor = (chbFactor.Checked) ? 1 : -1;

        Или я что-то не заметил?
        Ответить
        • Так правильно, так и должно было быть :)... А вторая строчка - говнокод :)
          Ответить
        • А если переменная factor будет использоваться ниже?
          Ответить
          • И что? Если бы она использовалась между первой и второй приведенной здесь строкой, то такие манипуляции можно было объяснить. Но здесь как ни крути factor будет или -1 или 1.
            Ответить
      • int factor = (chbFactor.Checked) ? 1 : 0;
        Это по вашему не условный переход?
        Ответить
        • это процессор сопримизирует при помощи команды setxx
          Ответить
          • В таком случае оптимизируется и следующая конструкция:
            if (chbFactor.Checked) factor = 1; else factor = 0;
            замечание "нет условных переходов" не засчитано.
            Ответить
            • Попробуйте скомпилить простой код с if-else и ?:, а потом посмотрите на полученный IL код, удивительно, но он разный.
              Само собой условный переход имеет место в обоих случаях, но с ?: инструкций получается меньше.
              Ответить
              • черт, я не заметил что это С#...
                все что я говорил относилось к С++ и х86.
                Ответить
              • Это пока говнокомпилятор С#. Дальше будет лучше. :)
                Ответить
          • Это говнооптимизация для современных процессоров. Таким образом программу можно выполнять только последовательно. Инструкции не спариваются.

            Сами попробуйте и напишите 2 эквивалентных проги с циклом с несколькими перемещениями данных в цикле, в зависимости от условия на ассемблере через setx и условный переход.

            Покрайней мере результат измерений на новых процессорах вас удивит. Выйгрышь за переходами и серьёзный. Конечно может и можно найти вариант, где setx быстрее, но в большинстве случаев так...
            Ответить
            • а кто сказал что команды setxx не спариваются? она спарится со следующей за ней коммандой, а вот jxx точно не спарится, так как он зависит от флагов в предыдущей команде его поведение плохо предсказывается чтоб спарить со следующей, если предсказатель ошибся то еще и такты простоя...
              Ответить
              • >а кто сказал что команды setxx не спариваются?
                А с чем им спариватся? У них нет самцов.;p
                Ответить
            • Боюсь разочаровать вас. Если вы компилируете без оптимизаций, ради того чтобы ваш холостой цикл тупо небыл вырезан оптимизатором, то ваш эксперимент некорректен, ибо тогда все переменные хранятся в ОЗУ, а не в регистрах, и время выполнения многих операций растёт. И если делать так, то действительно, эксперимент сходится с вашими утверждениями.

              Однако, пытаясь приблизиться к случаю со включенными оптимизациями, я провёл эксперимент вставив нужный ассмовый код в качестве volatile вставки, и пришёл к обратному выводу. А т.к. обычно программа компилируется с оптимизациями, то для себя я сделаю вывод, что обычно алгоритм с setx работает где-то на 20% быстрее, чем алгоритм с jx.

              Хотя на самом деле, тут ещё вопрос в выравнивании и т.п. В каждом конкретном эксперименте может быть является возможным получить разные результаты.
              Ответить
    • да здраствует bool-shit
      Ответить
    • а где тут решетка?
      Ответить
      • Какая разница?! Код имеет косвенные элементы "решётки": "bool", ".Checked". Зачем куда-то в другое место это помещать?
        Ответить

    Добавить комментарий