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

    −48

    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
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    // https://github.com/vk-com/kphp-kdb/blob/ce1ac4fbde2d3b546936ad07d6a748958f6d2198/net/net-http-server.c#L253
                if (D->wlen == 3 && !memcmp (D->word, "GET", 3)) {
                  D->query_type = htqt_get;
                } else if (D->wlen == 4) {
                  if (!memcmp (D->word, "HEAD", 4)) {
                    D->query_type = htqt_head;
                  } else if (!memcmp (D->word, "POST", 4)) {
                    D->query_type = htqt_post;
                  }
                }
    //...
                if (D->wlen != 0) {
                  /* HTTP/x.y */
                  if (D->wlen != 8) {
                    c->parse_state = htqp_skiptoeoln;
                    D->query_flags |= QF_ERROR;
                  } else {
                    if (!memcmp (D->word, "HTTP/1.0", 8)) {
                      D->http_ver = HTTP_V10;
                    } else if (!memcmp (D->word, "HTTP/1.1", 8)) {
                      D->http_ver = HTTP_V11;
                    } else {
                      c->parse_state = htqp_skiptoeoln;
                      D->query_flags |= QF_ERROR;
                    }
                  }
                }
    ...
              if (D->wlen == 4 && !strncasecmp (D->word, "host", 4)) {
                D->query_flags |= QF_HOST;
              } else if (D->wlen == 10 && !strncasecmp (D->word, "connection", 10)) {
                D->query_flags |= QF_CONNECTION;
              } else if (D->wlen == 14 && !strncasecmp (D->word, "content-length", 14)) {
                D->query_flags |= QF_DATASIZE;
              } else {
                D->query_flags &= ~(QF_HOST | QF_DATASIZE | QF_CONNECTION);
              }
    //...

    Великие олимпиадники-оптимизаторы, разработчики kPHP. Лучше сначала проверить длину строки, и только потом, если длина строки подходящая, проверять строку через strncasecmp (очень дорогостоящая операция)
    Об их мегагениальных оптимзациях я уже ранее писал: http://govnokod.ru/15406
    Но тут наверняка ж можно намного лучше заоптимизировать. Давайте подумаем, как можно улучшить сие творение истинных гениев

    Запостил: j123123, 19 Апреля 2016

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

    • Например, зачем они вообще используют эту непонятную strncasecmp функцию? Вот например взять слово "host" - там всего 4 байта. Это отлично укладывается в uint32_t переменную. Но просто так засунуть слово надо игнорировать разрядность каждой буквы.
      Например, надо все возможные кобенации из больших и малельких букав запихнуть в массив "host" "Host" "hOst" "HOst" "hoSt" ну и так далее и втобы там были переменные unint32_t одно слово одна переменная, и чтоб отсортировать, а потом через двоичный поиск нахожить, еслть ли там подходящая кобенация из 4 букв, находится за скорость O(log n) сравнений кобенаций - оптимизированно
      Ответить
      • Но вот у слова "connection" и "content-length" уже намного больше кобениаций будет.
        Там "connection" - 10 буков это как 10 бит - а 10 бит это 2^10=1024кобенаций.
        А в "content-length" 14 буков, но '-' не считается, так что всего 13 буков 2^13=8192 кобенаций
        Много памяти расходуется, неэкономно. Может надо проверять кобенации кусками по 4 байт? Или какой размер будет оптимальнее?
        Ответить
      • Игнорировать регистр можно and'ом.
        Ответить
        • Занулить каждый шестой битик в байтике через маску, да. Отличная оптимизация
          Ответить
          • Но этот метод недостаточно универсален, например он не будет работать с не-ascii кодировкой. Например с какой-нибудь кодировкой типа koi8-r для кириллических букв
            Ответить
            • Так там же GET, POST, HOST и никакой кириллицы.
              Ответить
              • Ну это пока. Скоро уж сделают Исконно Русский Национальный Православный Интернет ППГ(протокол передачи гипертекста, аналог капиталистического HTTP) , где вместо GET POST и HOST будет ВЗЯТЬ ОТПРАВИТЬ и ХОЗЯИН. А использование англоязычных слов надо запретить как пособничество пятой колонне. Там вон уже в новостях предлагали запретить иностранніе язblкиъ.
                https://meduza.io/news/2015/01/30/irina-yarovaya-ob-yavila-izuchenie-inostrannyh-yazykov-ugrozoy-traditsiyam

                Короче, надо эту АСЦИИ кодировку вообще искоренить невозьбранноъЪ. Надо и языки использовать исконно рюсские, чтоб только на 1C писали, на Рапире, и на языке РАЯ(исконно православном), ну и можно Языкъ Си руссифицировать, и ассемблеры всякие, это тоже
                Ответить
                • Так в этом случае кроме сравнений кириллицы весь код переписать придётся.
                  Останется разве что поле wlen да метод PUT, чтобы гейропейцы знали истинных вождей.
                  Ответить
                • ПОЛУЧИТЬ /документы/файл.рай
                  ППГТ/1.1
                  
                  Принимаю:*/*
                  Пронимаю-Кодировку:гзип
                  Принимаю-Языки:рус-Рос
                  Соединение:долгие-лета
                  Машина:говнокод.рф
                  Имя-Мое:ОбозревательРус/5.0 (РусОС 64)
                  Ответить
                  • http://ic.pics.livejournal.com/tragemata/25155229/1615892/1615892_original.jpg
                    Ответить
          • зачем в байтике? Сразу uint32_t-представление четырех букв домножаешь на 0xDFDFDFDF и сверяешь с uppercase-строкой. Профит
            Ответить
    • надеюсь, под "проверить длину строки" ты подразумевал не strlen.
      Ответить
      • Ну у них там какая-то дурацкая здоровенная структура struct hts_data
        https://github.com/vk-com/kphp-kdb/blob/ce6dead5b3345f4b38487cc9e45d55ced3dd7139/net/net-http-server.h#L42

        с какой-то непонятной херней, типа
        .
          int extra_int;
          int extra_int2;
          int extra_int3;
          int extra_int4;
          double extra_double, extra_double2;

        Там в одном из членов этой структуры хранится размер строки
        Ответить
      • Вот этой херней они из какого-то там говна считывают куски текста, разделенные пробелом
        .
                  while (ptr < ptr_e && ((unsigned) *ptr > ' ')) {
                    if (D->wlen < 15) {
                      D->word[D->wlen] = *ptr;
                    }
                    D->wlen++;
                    ptr++;
                  }

        Этим говном оно читает HTTP запрос, посланный браузером в их говновебсервер. Какие-то куски текста выцепляет. Лень разбирать это говно
        Ответить
    • if (D->wlen == 3 && !memcmp (D->word, "GET", 3))

      Инкапсуляция? Не, не слышал
      Ответить
    • Ну вообще-то любая реализация std::string делает то же самое. Че плохого-то?
      Ответить
      • Плохое например в том, что надо делать
        if (D->wlen == 3 && !memcmp (D->word, "GET", 3))

        вместо
        if (compare_this_shit(D, "GET"))

        Вот эта вот херня с ручным проставлением числа букв в строке с которой мы сравниваем ту вот херню, типа в "GET" три буковки, и мы будем три буковки сравнивать, надо ручками набирать, сколько там буковок в слове, с которым мы сравниваем эту говностроку.
        И еще мы ручками каждый раз пишем сначала говнопроверку, что там есть три буквы, или может быть нет? Вот если там точно три буквы, только тогда будем сравнивать с "GET"
        Нет чтобы как-нибудь это автоматизировать
        Ответить
        • Такой макрос бессмысленен, т.к. будет считать длину строки в рантайме через strcmp. Вот допустим в плюсах я могу через constexpr написать метод, который в компайлтайме посчитает длину строки и будет сверять сразу с ней. А это си, если верить тебе же.
          Ответить
    • В кококодобазе одного прожэкта просто ДОХУЯ макросов типа:
      #define KOKOKO_EQUAL(_a, str) ((_a).len == sizeof(str) - 1) && strncmp((_a).ptr, str, (_a).len) == 0)


      Premature optimization во всех полях.
      Ответить
    • > Великие олимпиадники-оптимизаторы

      по моему опыту, такой код (я посмотрел весь файл) пишут не олимпиадники, а шахматисты.

      олимпиадники ищут быстрые решения, поэтому код часто напичкан дефайнами и прочими синтаксическими подсластителями, но все таки кое-как структурирован (что бы меньше писать и быстрее рефакторить).

      шахматисты же загружают проблему в моск, думают пару минут, а потом высирают 2-5К строк функцию, часто с кучей ручного нетривиального копипаста.

      хотя конечно hts_parse_execute() (из которой запощеные куски выдраны) до шедевральных монументов которые я видел не дотягивает, но с 400 строками плотного кода - очень близко.
      Ответить
      • >>олимпиадники
        >>рефакторить
        ого
        Ответить
        • > >>олимпиадники
          > >>рефакторить

          > ого

          у тебя с рефакторингом похоже только позитивные ассоциации. я видел примеры где легким движением руки весь код ставился на с ног на голову.
          Ответить
          • Я делал рефакторинги, где весь код удаляется нахуй.
            Ответить
            • это самый лучший рефакторинг! Guaranteed "error free" (tm) (rm) (c)!
              Ответить
      • Ну если посмотреть копирайт к тому коду:

        Расследование:
        Copyright 2010-2012 Vkontakte Ltd - копирайт вконтакта, это понятно
        2010-2012 Nikolai Durov - это брат Павла Дурова.
        В студенческие годы Николай был членом команды СПБГУ, которая является чемпионом международной студенческой олимпиады по программированию 2000—2001 годов.

        2010-2012 Andrei Lopatin - Андрей Лопатин, старший преподаватель кафедры системного программирования математико-механического факультета СПБГУ - победитель открытого личного чемпионата мира по программированию TopCoder Open - 2009 в номинации Marathon Match!

        Преподаватель математико-механического факультета СПбГУ Андрей Лопатин в начале «нулевых» в команде с братом Павла Дурова Николаем два года подряд выигрывал студенческий чемпионат мира по программированию ACM-ICPC. К тому же он занимался подготовкой этих самых олимпиадников

        2012 Anton Maydell -- Антон Майдель, олимпиадник
        https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_authorstats&userid=1018709

        к тому же еще и шахматист https://vk.com/id112908167 (так что похоже что ты насчет шахматиста прям в точку)

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

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

          Да никакого отпечатка нет, лол, просто расширение кругозора и способности думать.
          Ответить
          • Ну если Dummy00001 так метко смог увидеть в этом коде следы шахматного программиста, который там действительно был, наверняка какой-то след все ж остается
            Ответить
            • ничего не сказывается дурно на программисте кроме злоупотребления барбитуратами и "программирования" на PHP
              Ответить
        • > А шахматы-то каким боком тут?

          Такой народ любит долго и глубоко думать. И исходят из того что все кто будут код в будущем читать и править, могут с легкостью весь мысленный процесс повторить.

          В добавок встречается код который с виду грабли, но работает. Логика как спагетти - но продумана на все... 99%. И вот что бы тот последний 1% найти где не работает, приходится эти макароны раскручивать, временами наступая на грабли каких неожиданных побочных эффектов.

          Я уже двух коллег заядлых шахматистов имел. Вот такие были наблюдения. Просто в лоб тривиальный код написать у них получается только плохо. (Но преимущество что им даешь какую монументальную проблему, и они тебе за пару дней ее надежно решают.)

          > Я например встречал мнение, что от олимпиадников бывает сложно в итоге добиться нормального читаемого кода, потому как они привыкли на тяп-ляп все писать, лишь бы эта хрень работала

          я работал с олимпиадниками и наша проблема была что народ очень быстро решает проблему - но вот решение это оформить в продукт просто не способны. Ядро программы написать - могут. Но ядро это только 5-10%. Остальные 90-95% нужно искать кого другого. а потом появляется проблема что коммуницировать олимпиадныки тоже могут потому что у них все очевидно и говорить и объяснять нечего.
          Ответить
          • ха-ха-ха, знакомая картина

            А потом
            --Вася, а как работает твой модуль? А там ничего не понятно и ни строчки документации
            --Ой, ну там все просто, почитай код
            Ответить
        • > И вообще, дают ли навыки игры в шахматы и навыки олимпиадного программирования какой-то профит, если заниматься нормальным программированием?
          Я так думаю, что профит есть. Как бывший шахматист, могу сказать, что легче воспринимать сценарии развития событий в коде, т.е. if-else-лапша
          Ответить
      • > думают пару минут, а потом высирают 2-5К строк функцию

        Мне бы так уметь! А то думаешь тут целый день, потом 30 строчек пишешь.

        Ну да ладно, я так понял, что и олимпиадников и у шахматистов код write-only, потом хрен разберёшь, что это и для чего было написано )
        Ответить
    • Я как-то первую букву проверял на 'G' или 'P'. Было норм.
      Ответить
    • показать все, что скрытоvanished
      Ответить

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