Антон Полухин - C++ трюки из userver

Поделиться
HTML-код
  • Опубликовано: 31 янв 2024
  • Ближайшая конференция: С++ Russia 2024, 24 мая (online), 2-3 июня (offline, Москва)
    Подробности и билеты: jrg.su/W8skjE
    - -
    Антон рассказывает о новых C++ трюках и приемах:
    - LazyPrvalue;
    - Обнаружение ODR violation из C++ кода;
    - Самая чудная bimap.
    В чате конференции С++ Russia уже обсуждался последний трюк с чудной bimap. В докладе подробно рассматриваются как предыстория вопроса, так и итоговые результаты с бенчмарками.
    Готовый к использованию код из доклада уже можно найти на userver.tech/
    #benchmarks#performance
  • НаукаНаука

Комментарии • 50

  • @nskeip
    @nskeip 5 месяцев назад +21

    С болью в сердце думаю о том, что есть С++ программисты, которым приходится разбираться c prvalue без Антона :))

    • @AntonyPolukhin
      @AntonyPolukhin 5 месяцев назад +5

      Так с prvalue не я разобрался в этом примере. Это был Антон Жилин, и сделал он это мимоходом :)

    • @funfunfun536
      @funfunfun536 4 месяца назад +9

      @@AntonyPolukhin Тот случай, когда даже Антону нужен свой Антон ))

  • @cheefoxcheefox2372
    @cheefoxcheefox2372 5 месяцев назад +17

    Когда ты сражаешься не с проблемой, а с инструментом, который должен её решать 👍

  • @colorinvader1173
    @colorinvader1173 5 месяцев назад +3

    Классно, что обновили документацию. Выглядит современнее ++ удобнее работать.

  • @user-on1rf1oj9z
    @user-on1rf1oj9z 5 месяцев назад +4

    Самый правильный тип программистов - "ленивые неленивые программисты" - лучше потратить время на удобные инструменты (типы/структуры данных), а потом быстро их использовать )

  • @leanidchaika
    @leanidchaika 5 месяцев назад +4

    Обожаю послушать Антона... Всегда куча нового, прикольного! И конечно в конце жду, что будет ссылка на либу, код, что бы просто все готовое можно было использовать, т.к. то что Антон говорит - "просто написать контейнер" - это неделя работы минимум хорошего программиста в моей команде, а новичок может и напишет быстрее, только потом переписывать придется.

    • @AntonyPolukhin
      @AntonyPolukhin 5 месяцев назад +1

      Все примеры есть в фреймворке userver. Он опенсорсный и есть на гитхабе. Там даже есть часть universal, которая не используетткорутины и применима в любом проекте

  • @user-mi8es4ur5w
    @user-mi8es4ur5w 5 месяцев назад +2

    lazy prvalue - огонь!

  • @user-dx2iw1hm3d
    @user-dx2iw1hm3d 3 месяца назад

    Кто-нибудь может написать версию линкера и платформу, под которой не ловится дублирование символов. Мб я составляю маленькие примеры но мне линкер всегда выдает ошибку при попытке слинковать файлы, которые определяют функции, совпадающие по сигнатуре.

  • @sigasigasiga
    @sigasigasiga 2 месяца назад

    41:21 жаль только, что Антон забыл сказать о том, что weak_ptr от такого указателя лучше не конструировать😅

  • @milbrus735
    @milbrus735 5 месяцев назад +1

    Может быть примеры неудачные, но наличие мьютекса и отсутствие конструкторов как бы намекают на использование std::shared_ptr. Лет 10 назад написал на хабре "JSON-сериализатор на быстрых шаблонах", так он весь построен по принципу как у вас enum, правда он ещё на 03 стандарте и enum там тоже есть и флаги, когда int представленный как A|B|C сериализуется (и десереализуется, разумеется) либо в строчку "A|B|C" лобо в массив ["A", "B", "C"], до сих пор используем во всех проектах

    • @AntonyPolukhin
      @AntonyPolukhin 5 месяцев назад +2

      Да можно воспользоваться `std::shared_ptr` или `std::unique_ptr` передав в них `new third_party_lib::Something{third_party_lib::Something::Create()}`. Но это добавит индирекцию и лишнюю динамическую аллокацию на каждый объект

    • @MAKCIM666
      @MAKCIM666 5 месяцев назад +1

      @@AntonyPolukhin А делали замеры на реальный прирост производительности от внедрения ленивого prvalue? Понятное дело, это приятно, когда ты делал-делал трюк и он внезапно заработал, да ещё и как надо, но когда речь идёт о 2us против 3us на массиве из 100 500 объектов при типичном использовании массивов на 42 объекта - овчинка, очевидно, выделки не стоит.

    • @AntonyPolukhin
      @AntonyPolukhin 5 месяцев назад

      @@MAKCIM666 LazyPrvalue у нас в частности используется при порождении асинхронной таски, и спасает от лишней динамической аллокации. То есть на каждый запрос убирает в среднем 1мкс и экономит пару сотен байт оперативной памяти до границы корзинки аллокатора (там два больших объекта, поэтому счёт именно на сотни байт)

  • @daniel3780
    @daniel3780 4 месяца назад

    Пример с бимапой это какой стандарт? 20 говорит "не хочу constinit вместе с explicit".

  • @donutsleader
    @donutsleader 5 месяцев назад +2

    Если вы все равно используете кодогенерацию, почему не скодогенерить функции трансляции енума в строку и обратно вместо этой БиМапы?
    Не нужно будет полагаться на оптимизацию компилятора, которая внезапно не отломается. За одно и в дебаге будет работать все.
    А еще и бонусом будет ускорение компиляции и меньше "мусорных" impl-символов )

    • @MakarenkoSasha
      @MakarenkoSasha 5 месяцев назад +2

      им же было скучно ))

    • @AntonyPolukhin
      @AntonyPolukhin 5 месяцев назад

      Потому что тогда надо описать в "птичеьм языке" маппинг энума, настроить сборку на запуск кодгена или закомитить результаты и настроить проверки что закомиченное не разехалось...
      Или можно просто воспользоваться TrivialBiMap прям из C++ кода

    • @donutsleader
      @donutsleader 5 месяцев назад +1

      @@AntonyPolukhin принимается )
      Однако птичим языком может быть просто хедер, в котором этот энум и задефайнен )
      Кстати добиться такого уровня оптимизации, чтобы целиком избавиться от вызова bcmp из bool operator==(std::string_view,...) на годболте у меня не вышло (clang).
      Для самописного view - получилось, но не прямо до сравнения с интами, только до санролленых побайтовых сравнений.

  • @mpmuradov
    @mpmuradov 5 месяцев назад

    получается, что case insensitive сравнение строк в trivialbimap не даст уже скорости за счет сравнения строк по 4-8 байт?

    • @user-on1rf1oj9z
      @user-on1rf1oj9z 5 месяцев назад

      Строчки, наверное, ограничиваются ascii таблицей, там lowercase просто and с константой

  • @vladimir0rus
    @vladimir0rus 5 месяцев назад +6

    Проблему необходимости копирования старых данных при увеличении размера массива можно решить очень элегантно, если знать как работает виртуальная память.
    Просто сразу создавайте массив максимальной длинны, с большим запасом, что бы его никогда не пришлось расширять. Пока вы не записали в него все данные он будет потреблять ровно столько памяти сколько в него было записано. Только не забудьте что инициалзировать по старинке его нельзя и вектор тут не подойдет, он попытется инициализировать всю память и умрет.
    UPD: поскольку не до всех дошло очевидное, массив конечно же надо не на стеке создавать, а аллоцируя память в куче (malloc/new). И речь идет о больших объемах, а не о сотне элементов (когда у вас расширение вектора уже создает проблему).

    • @vladimir0rus
      @vladimir0rus 5 месяцев назад

      @Red_Paper6495 бери 10ТБ не ошибешься.

    • @MsGordon01
      @MsGordon01 5 месяцев назад +2

      Никогда так не делайте. Человек не полностью понимает как работает виртуальная память. Только лишь в very happy path это будет работать. На самом деле jemalloc и так умеет расширять размер аллокации без перемещения, соответствующий код легко находится в исходниках. Тут дело другое: семантике с++ на все это совершенно наплевать.

    • @vladimir0rus
      @vladimir0rus 5 месяцев назад +1

      @@MsGordon01 ну давай расскажи всем как виртуальная память работает и что не так в аллокации памяти с запасом. Или ты не понял каким образом нужно память выделить?

    • @vladimir0rus
      @vladimir0rus 5 месяцев назад

      @Red_Paper6495 возьми 10ТБ, не прогадаешь

    • @vladimir0rus
      @vladimir0rus 5 месяцев назад +2

      @Red_Paper6495 почему именно новореги такие хамло?

  • @patlecat
    @patlecat 3 месяца назад

    Do videos in English on uServer pls

    • @CUserGroupRussia
      @CUserGroupRussia  3 месяца назад +2

      Hello! You can turn on subtitles and choose auto-translate in English.

    • @patlecat
      @patlecat 3 месяца назад

      @@CUserGroupRussia ok but it would be great to have some vids in English too and most importantly some tutorials!

    • @patlecat
      @patlecat 3 месяца назад

      @@CUserGroupRussiaThe translation here is not good, I can barely follow the talk a lot of information is lost.

  • @VitaliyAksyonov
    @VitaliyAksyonov 4 месяца назад +3

    В который раз убеждаюсь, что C++ пошёл куда-то не туда. Вместо того, чтобы просто писать код, надо придумывать костыли, которые обходят другие костыли, котоыре уже принесли разработчики стандарта, когда обходили свои же костыли из предыдущих версий.

    • @grincha09
      @grincha09 4 месяца назад +1

      И js с собой за ручку повел

  • @TheInspctrcat
    @TheInspctrcat 5 месяцев назад +3

    Плюсовики изобрели слайсы что ли?

  • @gosuwebwizard
    @gosuwebwizard 5 месяцев назад +2

    за копеешную зарплату ребята херачат.... ((((

    • @Max-ob8gq
      @Max-ob8gq 5 месяцев назад +3

      печальная участь всех с++ программистов. больше всех знают о программировании и операционных системах и получают меньше всех

    • @gosuwebwizard
      @gosuwebwizard 5 месяцев назад

      и что там?@Red_Paper6495

  • @MsGordon01
    @MsGordon01 5 месяцев назад +5

    Послушал с интересом и ушёл дальше разрабатывать на расте

  • @gngrinboxru
    @gngrinboxru 5 месяцев назад +4

    С такими талантами и работать на яндекс в 2024 году это просто позор.

    • @zlatoust4444
      @zlatoust4444 5 месяцев назад +9

      Так они не работают, а извращаются, в лекции как раз об этом😅

  • @zlatoust4444
    @zlatoust4444 5 месяцев назад +2

    Не понравилось. Если приходится в такие дебри лезть- то это уже не программирование, а извращения. Ну Яндекс под Кудриным верной дорогой идет.

    • @IExSet
      @IExSet 5 месяцев назад +7

      ЛОЛ. Программирование всегда было извращением (кучей хаков, трюков, узких мест и т.п.), иначе это не программирование, а скриптование 🙂