1. Си / Говнокод #22876

    −33

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    #include <http://govnokod.ru/21585>
    
    // assembly output for f1_signed and f2_signed on GCC 7,6,5 ... versions are same
    
    signed char f1_signed(signed char a1, signed char a2, signed char a3)
    {
      return MAXS(a1,a2,a3,a1,a2,a3);
    }
    
    signed char f2_signed(signed char a1, signed char a2, signed char a3)
    {
      return MAXS(a1,a2,a3);
    }
    
    // assembly output for f1_unsigned and f2_unsigned on GCC 7,6,5 ... versions are differend
    // GCC compiler can't do same simplification for unsigned function
    
    // This function produces much more assembler code than second
    unsigned char f1_unsigned(unsigned char a1, unsigned char a2, unsigned char a3)
    {
      return MAXS(a1,a2,a3,a1,a2,a3);
    }
    
    unsigned char f2_unsigned(unsigned char a1, unsigned char a2, unsigned char a3)
    {
      return MAXS(a1,a2,a3);
    }

    https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80574

    Очередной мой багрепорт в GCC. Компилятор GCC может заоптимизировать повторяющуйся в MAXS хрень для signed char, но не может для unsigned
    А вот Clang не может заоптимизировать ни то, ни другое. https://godbolt.org/g/7Kt9X0

    Запостил: j123123, 30 Апреля 2017

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

    • показать все, что скрытозаоптимизировал твои дырки, проверь
      Ответить
    • Скажи спасибо, что конпелятор хоть что-то может сделать с этим ёбаным лесом из тернарников, который экспоненциально(?) растёт от N...
      Ответить
    • показать все, что скрыто
      #include <http://govnokod.ru/21585>


      А ЧТО, ТАК МОЖНО?
      Ответить
      • В C21 ввели - чтобы качественный код сразу в продакшен!
        Ответить
      • http://httpfs.sourceforge.net/
        Ответить
        • Вот кстати почему такую питушню не сделали?
          В браузерах такие инклюды срабатывают чуть менее, чем при каждом исполнении программы, а в сишке бы срабатывали чуть менее, чем при каждой компиляции, предлагая пользователю ту же самую скомпилированную программу, что и раньше.
          Ответить
          • Особенно весело будет, если во время компиляции кто-то решит поменять .h файл на сервере, и часть кода скомпилируется с одним, часть с другим инклудом
            Ответить
            • Это уже мелочи и детали реализации.
              1. Можно заранее пройтись по всем файлам, скачать и закэшировать перед компиляцией (заодно *.c и *.lib куда надо положить)
              2. На сервере выкладывать файл состояния, содержащий либо DOWN (идёт обновление), либо UP <unique ID> (сайт работает), содержимое которого проверять на клиенте до и после скачивания всего. Такие файлы можно и вручную создавать.
              3. Если и этого не хватит, пакеты складывать в *.zip (соответственно, include <http://..../fastsring.zip/string.h> и ясное знание о том, какие каталоги с какими *.c/*.lib куда распаковать). По крайней мере, в компиляторе организовать поддержку таких пакетов.
              Ответить
              • запаковал свой член в твою кишку, проверь
                Ответить
                • Оборвал твою бирку, выпотрошил все чаинки и развеял по ветру, проверь.
                  Ответить
          • Это же Plan9.
            Ответить
          • В го есть (ну почти, можно с гит сервера импортировать).
            Ответить
    • к слову, сравни с крестовой реализацией:
      #include <utility>
      #include <type_traits>
      
      template<typename T>
      T vmax(T&&t)
      {
        return std::forward<T>(t);
      }
      
      template<typename T0, typename T1, typename... Ts>
      typename std::common_type<
        T0, T1, Ts...
      >::type vmax(T0&& val1, T1&& val2, Ts&&... vs)
      {
        if (val2 > val1)
          return vmax(val2, std::forward<Ts>(vs)...);
        else
          return vmax(val1, std::forward<Ts>(vs)...);
      }
      
      
      signed char x1_signed(signed char a1, signed char a2, signed char a3)
      {
        return vmax(a1, a2, a3, a1, a2, a3);
      }
      
      signed char x2_signed(signed char a1, signed char a2, signed char a3)
      {
        return vmax(a1, a2, a3);
      }
      
      
      unsigned char x1_unsigned(unsigned char a1, unsigned char a2, unsigned char a3)
      {
        return vmax(a1, a2, a3, a1, a2, a3);
      }
      
      unsigned char x2_unsigned(unsigned char a1, unsigned char a2, unsigned char a3)
      {
        return vmax(a1, a2, a3);
      }

      спойлер: на ней компилеры (кроме гсс) лажаются еще хуже.
      Ответить
      • показать все, что скрытоНалажал тебе за щеку, проверь.
        Ответить
      • Потому что такое же экспоненциальное говнище (если инлайнить), только в профиль...

        Почему бы не закешировать в переменную максимум от хвоста и сравнить голову с ним? Получится няшно и линейно.
        Ответить
        • Ну или return vmax(std::max(val1, val2), std::forward<Ts>(vs)...), если принципиально, чтобы с начала сравнение шло...
          Ответить
        • так тут же тоже линейно. это же на темплейтах нормальная цепочка сравнений. почти ФП.
          Ответить
          • Чтобы получилось линейно, конпелятору надо ещё догадаться, что обе ветки можно смёрджить в одну (иначе получится экспоненциально растущее древо, как и с макроговном). Либо вообще не инлайнить, что скучно.

            Вариант в ФП стиле я выше предложил. Его по-любому все конпеляторы смогут осилить ;)
            Ответить
      • Вообще да, вся эта плюсовая питушня-метушня для анскиллябр заедушных, она хреново оптимизируется http://lionet.livejournal.com/140057.html
        Ответить
        • https://github.com/graphitemaster/cvec - а вот как настоящие цари пишут вектор на сишке через препроцессор. Не то что эти плюсы говняные
          Ответить
        • хахаха
          >>У нас в MZ — есть. Компания зарабатывает несколько миллионов долларов в день. А в вашем НИИГиТ наверняка нет ни >>таких средств, ни таких требований к производительности, которые бы требовали кластер

          так и хочется добавить "потому делайте дальше свои сайты-визитки в дримвивире и не выябывайтесь"
          Ответить
        • если байтоёбством занимаешься, то тот простой факт что `this` сжирает один регистр - еще более фундаментальное говно.

          ЗЫ я думал в сторону constexpr, как type-safe дефайны. я только после того как сплагиатил с SOнаписал код "заметил" что ты с переменными трахаешься, и это просто тупая экзотика и жуткий частный случай, где все нормальные люди напишут `?:` и забьют.
          Ответить
          • показать все, что скрыто>>если байтоёбством занимаешься, то тот простой факт что `this` сжирает один регистр -

            ну а если бы писал на плейнсях то первым аргумнетом был бы поинтер на структуру, и в моей колконвенции тот же самый регистр бы и занимал.

            что не так?

            или его копелятор мог бы переложить ?
            Ответить
            • показать все, что скрытоЧто за хуйню ты написал, придурок?
              Ответить
            • > что не так? или его копелятор мог бы переложить ?

              систематических тестов я не делал.

              недавно делал лобовую конверсию нескольких методов из обычных в статические, и заметил что у обоих IAR и гцц (на медиум/Оs) код получился меньше.

              про наезды микро-контроллерщиков на кресты и this я слышал раньше, но это был первый раз когда я лично увидел разницу своими глазами. разница у меня была небольшая - выхлоп дизасма у самой большой функции был где-то 80 инструкций - но на ~3-5 инструкций стала короче.

              ЗЫ что конечно просто мелочи по сравнению с последствиями "хорошего дезайна". а попробуй найди нового разраба для крестов, который тебе *не* будет на все подряд интерфейсы/паттерны/этц клепать.
              Ответить
              • показать все, что скрыто> который тебе *не* будет на все подряд интерфейсы/паттерны/этц клепать.

                Вменяемые, как правило, сильно ООП с наследованием и виртуальностью не увлекаются, ибо это довольно уныло. Я иногда использую "интерфейсы", но только когда без них код нормально не структурируешь. "ООП" и "паттерны", как правило, не друзья нормальному крестолюбу, ибо мешают использовать компилятор для нахождения ошибок.

                Вот жабоеды да, без паттернов никуда.
                Ответить
                • > Вот жабоеды да, без паттернов никуда.

                  Но Жаба это новый Пасцаль и Васик. Система образования медленно уверенно на него пересаживается.

                  Почти все новички которых встречал начинали с жабы. Если кто-то думал что васика начинать плохо...

                  От тюрьмы и от сумы жабы, как не зарекайся, никуда не денешься.
                  Ответить
      • ага, щас. Плюсовая реализация линейная
        template <typename ...Args>
        constexpr auto vmax(Args&& ...args) {
          using T = std::common_type_t<Args...>;
          return std::max({static_cast<T>(std::forward<Args>(args))...});
        }
        Ответить
    • https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80588 - да, вот кстати другой мой багрепорт, который я по мотивам этого сделал (в комментах есть) на тему того, что круче, инлайн функции или тупо раскрытие макросни. Clang кстати у GCC тут выигрывает - он все нормально заоптимизировать может. Иными словами, идеального во всех планах компилятора пока что нет, одни сосут в одном, другие в другом
      Ответить
    • показать все, что скрытоЧто это за хуита, j123123
      Ответить
      • показать все, что скрытоЭто мой очередной багрепорт в GCC, guest
        Ответить
        • показать все, что скрытоСледовательно GCC говно
          Ответить
          • показать все, что скрытоСледовательно прыщи говно
            Ответить
            • показать все, что скрытоВообще-то все компиляторы говно, и все ОС говно
              Ответить
              • показать все, что скрытоOs/360 не говно
                Ответить
              • следовательно: асм рулит.
                Ответить
                • показать все, что скрытоРулю твоим анусом, проверь.
                  Ответить
                  • вопрос: AnalPunisher - 5-7 лет ребёнок, или же взрослый но просто с недоразвитым пенисом и проблемами потенции?

                    я бы понял если бы это был бот - но очевидно что это кто-то пишет руками. как следствие, все что он пишет у него в голове как фантазия крутиться. и он уже долго пишет - что подтвеждает его хронические проблемы. то что хочет настоятельно кому то вставить (хочет контролировать ситуацию) однозначно намекает что он какой то сопливый прыщавый импотент. вопрос только: это у него из-за недостаточного возраста, или из-за проблем с потенцией?
                    Ответить
                    • показать все, что скрыто
                      Ответить
                    • показать все, что скрытоВсадил тебе по самую матку, проверь.
                      Ответить
                      • если как ты говоришь у тебя есть матка, то как ты, будучи женщиной, собираешься всаживать? или у тебя клитор распух настолько? или еще и сервикс выпучило наружу??...

                        ... и каких только типов на ГК не встретишь. похоже эти trans-gender и до наших далей добрались.
                        Ответить
                        • показать все, что скрытоМатка у тебя, придурок.
                          Ответить
                          • у меня нет матки, что очевидно потому что я мужик. в отличии от тебя.

                            не только твоя ориентация стоит под вопросом, но даже твой пол.

                            о, забыл об еще одном варианте: может быть ты кастированый? твои психозы и неврозы как ты здесь публично демонстрируешь можно объяснить побочными эффектами кастрации на слабую психику.

                            это даже объяснит почему ты боишься женщин и пытаешься мужикам вставлять. и почему ты остановится не можешь со своими глупыми постами: другого выхода эмоциям нету.
                            Ответить
                            • ну чего молчишь? я угадал? ты кастрат?

                              и не мужик, и не женщина - кастрат однозначно один из самых вероятных ответов. ну сразу после 5-7 летнего сопливого ребёнка.
                              Ответить
                              • Нехорошо дразнить юродивого. Этот человек использует сайт как анти-стресс, выливая негатив, накопленный в течение дня, - в спам.
                                Ответить
                                • я код ревью формальное делаю - изменений годичной давности - с плотностью комментариев 1 на 25 строк измененного кода. уже второю неделю, я тут плаваю и захлебываюсь в чужом говне, которого очевидно никто никогда уже фиксить не будет. AnalPunySher для меня просто идеальное отвлечение. психологию/анализ/нлп которыми в детстве увлекался уже забыл - но вдруг что вспомню.
                                  Ответить
                                  • показать все, что скрытоСделал ревью твоего ануса, проверь.
                                    Ответить
                                    • другими словами, я угадал: ты бедняжка, кастрат. так долго мучаешься что уже начал воображать что у тебя есть матка. неудивительно что ты на trans-gender похож.

                                      раскажи как твоя кастрация случилась. несчастный случай? или папа мама решили что такому как ты лучше не размножатся??
                                      Ответить
                              • AnalPunisher, тебе не надо ничего боятся. ну и что что у тебя никогда не будет своей семьи и детей - и что над тобой все всегда будут насмехатся. это не повод в петлю лезть. да суицид это лучше, чем тупо пытаться долбится на форумах (долбится то у тебя плохо получается, по очевидным причинам), но есть много других средств. например таже сублимация.
                                Ответить
                              • показать все, что скрытоVanished
                                Ответить
                • показать все, что скрыто
                  Ответить
    • Оффтоп:
      Шел 1207 год, линуксоиды так и не сделали DE с интерфейсом, как у Висты
      Хоть самому пиши
      Ответить

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