Няшная / Говнокод #19842 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 j123123, (Updated )

Комментарии (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 байт? Или какой размер будет оптимальнее?
      Ответить
      • Занулить каждый шестой битик в байтике через маску, да. Отличная оптимизация
        Ответить
        • Но этот метод недостаточно универсален, например он не будет работать с не-ascii кодировкой. Например с какой-нибудь кодировкой типа koi8-r для кириллических букв
          Ответить
            • Ну это пока. Скоро уж сделают Исконно Русский Национальный Православный Интернет ППГ(протокол передачи гипертекста, аналог капиталистического 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)
                Ответить
        • зачем в байтике? Сразу 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 строками плотного кода - очень близко.
    Ответить
      • > >>олимпиадники
        > >>рефакторить

        > ого

        у тебя с рефакторингом похоже только позитивные ассоциации. я видел примеры где легким движением руки весь код ставился на с ног на голову.
        Ответить
    • Ну если посмотреть копирайт к тому коду:

      Расследование:
      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, потом хрен разберёшь, что это и для чего было написано )
      Ответить
  • Ты же не знаешь мотивацию почему так сделано. Может они делали замеры и ускоряли.
    Ответить

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

Я, guest, находясь в здравом уме и твердой памяти, торжественно заявляю:

    А не использовать ли нам bbcode?


    8