Антон Полухин - C++ трюки из userver
ฝัง
- เผยแพร่เมื่อ 16 ต.ค. 2024
- Подробнее о конференции C++ Russia: jrg.su/W8skjE
- -
Антон рассказывает о новых C++ трюках и приемах:
- LazyPrvalue;
- Обнаружение ODR violation из C++ кода;
- Самая чудная bimap.
В чате конференции С++ Russia уже обсуждался последний трюк с чудной bimap. В докладе подробно рассматриваются как предыстория вопроса, так и итоговые результаты с бенчмарками.
Готовый к использованию код из доклада уже можно найти на userver.tech/
#benchmarks#performance
С болью в сердце думаю о том, что есть С++ программисты, которым приходится разбираться c prvalue без Антона :))
Так с prvalue не я разобрался в этом примере. Это был Антон Жилин, и сделал он это мимоходом :)
@@AntonyPolukhin Тот случай, когда даже Антону нужен свой Антон ))
Классно, что обновили документацию. Выглядит современнее ++ удобнее работать.
Когда ты сражаешься не с проблемой, а с инструментом, который должен её решать 👍
Обожаю послушать Антона... Всегда куча нового, прикольного! И конечно в конце жду, что будет ссылка на либу, код, что бы просто все готовое можно было использовать, т.к. то что Антон говорит - "просто написать контейнер" - это неделя работы минимум хорошего программиста в моей команде, а новичок может и напишет быстрее, только потом переписывать придется.
Все примеры есть в фреймворке userver. Он опенсорсный и есть на гитхабе. Там даже есть часть universal, которая не используетткорутины и применима в любом проекте
Самый правильный тип программистов - "ленивые неленивые программисты" - лучше потратить время на удобные инструменты (типы/структуры данных), а потом быстро их использовать )
lazy prvalue - огонь!
Пример с бимапой это какой стандарт? 20 говорит "не хочу constinit вместе с explicit".
Кто-нибудь может написать версию линкера и платформу, под которой не ловится дублирование символов. Мб я составляю маленькие примеры но мне линкер всегда выдает ошибку при попытке слинковать файлы, которые определяют функции, совпадающие по сигнатуре.
TrivialBiMap или похожее решение не помешало бы в какой boost засунуть
Если вы все равно используете кодогенерацию, почему не скодогенерить функции трансляции енума в строку и обратно вместо этой БиМапы?
Не нужно будет полагаться на оптимизацию компилятора, которая внезапно не отломается. За одно и в дебаге будет работать все.
А еще и бонусом будет ускорение компиляции и меньше "мусорных" impl-символов )
им же было скучно ))
Потому что тогда надо описать в "птичеьм языке" маппинг энума, настроить сборку на запуск кодгена или закомитить результаты и настроить проверки что закомиченное не разехалось...
Или можно просто воспользоваться TrivialBiMap прям из C++ кода
@@AntonyPolukhin принимается )
Однако птичим языком может быть просто хедер, в котором этот энум и задефайнен )
Кстати добиться такого уровня оптимизации, чтобы целиком избавиться от вызова bcmp из bool operator==(std::string_view,...) на годболте у меня не вышло (clang).
Для самописного view - получилось, но не прямо до сравнения с интами, только до санролленых побайтовых сравнений.
Может быть примеры неудачные, но наличие мьютекса и отсутствие конструкторов как бы намекают на использование std::shared_ptr. Лет 10 назад написал на хабре "JSON-сериализатор на быстрых шаблонах", так он весь построен по принципу как у вас enum, правда он ещё на 03 стандарте и enum там тоже есть и флаги, когда int представленный как A|B|C сериализуется (и десереализуется, разумеется) либо в строчку "A|B|C" лобо в массив ["A", "B", "C"], до сих пор используем во всех проектах
Да можно воспользоваться `std::shared_ptr` или `std::unique_ptr` передав в них `new third_party_lib::Something{third_party_lib::Something::Create()}`. Но это добавит индирекцию и лишнюю динамическую аллокацию на каждый объект
@@AntonyPolukhin А делали замеры на реальный прирост производительности от внедрения ленивого prvalue? Понятное дело, это приятно, когда ты делал-делал трюк и он внезапно заработал, да ещё и как надо, но когда речь идёт о 2us против 3us на массиве из 100 500 объектов при типичном использовании массивов на 42 объекта - овчинка, очевидно, выделки не стоит.
@@MAKCIM666 LazyPrvalue у нас в частности используется при порождении асинхронной таски, и спасает от лишней динамической аллокации. То есть на каждый запрос убирает в среднем 1мкс и экономит пару сотен байт оперативной памяти до границы корзинки аллокатора (там два больших объекта, поэтому счёт именно на сотни байт)
А чем deque хуже FIxedArray?
получается, что case insensitive сравнение строк в trivialbimap не даст уже скорости за счет сравнения строк по 4-8 байт?
Строчки, наверное, ограничиваются ascii таблицей, там lowercase просто and с константой
Проблему необходимости копирования старых данных при увеличении размера массива можно решить очень элегантно, если знать как работает виртуальная память.
Просто сразу создавайте массив максимальной длинны, с большим запасом, что бы его никогда не пришлось расширять. Пока вы не записали в него все данные он будет потреблять ровно столько памяти сколько в него было записано. Только не забудьте что инициалзировать по старинке его нельзя и вектор тут не подойдет, он попытется инициализировать всю память и умрет.
UPD: поскольку не до всех дошло очевидное, массив конечно же надо не на стеке создавать, а аллоцируя память в куче (malloc/new). И речь идет о больших объемах, а не о сотне элементов (когда у вас расширение вектора уже создает проблему).
@Red_Paper6495 бери 10ТБ не ошибешься.
Никогда так не делайте. Человек не полностью понимает как работает виртуальная память. Только лишь в very happy path это будет работать. На самом деле jemalloc и так умеет расширять размер аллокации без перемещения, соответствующий код легко находится в исходниках. Тут дело другое: семантике с++ на все это совершенно наплевать.
@@MsGordon01 ну давай расскажи всем как виртуальная память работает и что не так в аллокации памяти с запасом. Или ты не понял каким образом нужно память выделить?
@Red_Paper6495 возьми 10ТБ, не прогадаешь
@Red_Paper6495 почему именно новореги такие хамло?
Do videos in English on uServer pls
Hello! You can turn on subtitles and choose auto-translate in English.
@@CUserGroupRussia ok but it would be great to have some vids in English too and most importantly some tutorials!
@@CUserGroupRussiaThe translation here is not good, I can barely follow the talk a lot of information is lost.
В который раз убеждаюсь, что C++ пошёл куда-то не туда. Вместо того, чтобы просто писать код, надо придумывать костыли, которые обходят другие костыли, котоыре уже принесли разработчики стандарта, когда обходили свои же костыли из предыдущих версий.
И js с собой за ручку повел
Плюсовики изобрели слайсы что ли?
Послушал с интересом и ушёл дальше разрабатывать на расте
В яблочко )
за копеешную зарплату ребята херачат.... ((((
печальная участь всех с++ программистов. больше всех знают о программировании и операционных системах и получают меньше всех
и что там?@Red_Paper6495
С такими талантами и работать на яндекс в 2024 году это просто позор.
Так они не работают, а извращаются, в лекции как раз об этом😅
Не понравилось. Если приходится в такие дебри лезть- то это уже не программирование, а извращения. Ну Яндекс под Кудриным верной дорогой идет.
ЛОЛ. Программирование всегда было извращением (кучей хаков, трюков, узких мест и т.п.), иначе это не программирование, а скриптование 🙂
41:21 жаль только, что Антон забыл сказать о том, что weak_ptr от такого указателя лучше не конструировать😅