Тёмный
No video :(

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

C++ User Group
Подписаться 15 тыс.
Просмотров 17 тыс.
50% 1

Подробнее о конференции C++ Russia: jrg.su/W8skjE
- -
Антон рассказывает о новых C++ трюках и приемах:
- LazyPrvalue;
- Обнаружение ODR violation из C++ кода;
- Самая чудная bimap.
В чате конференции С++ Russia уже обсуждался последний трюк с чудной bimap. В докладе подробно рассматриваются как предыстория вопроса, так и итоговые результаты с бенчмарками.
Готовый к использованию код из доклада уже можно найти на userver.tech/
#benchmarks#performance

Опубликовано:

 

23 авг 2024

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 52   
@nskeip
@nskeip 6 месяцев назад
С болью в сердце думаю о том, что есть С++ программисты, которым приходится разбираться c prvalue без Антона :))
@AntonyPolukhin
@AntonyPolukhin 6 месяцев назад
Так с prvalue не я разобрался в этом примере. Это был Антон Жилин, и сделал он это мимоходом :)
@funfunfun536
@funfunfun536 6 месяцев назад
@@AntonyPolukhin Тот случай, когда даже Антону нужен свой Антон ))
@cheefoxcheefox2372
@cheefoxcheefox2372 6 месяцев назад
Когда ты сражаешься не с проблемой, а с инструментом, который должен её решать 👍
@colorinvader1173
@colorinvader1173 6 месяцев назад
Классно, что обновили документацию. Выглядит современнее ++ удобнее работать.
@leanidchaika
@leanidchaika 6 месяцев назад
Обожаю послушать Антона... Всегда куча нового, прикольного! И конечно в конце жду, что будет ссылка на либу, код, что бы просто все готовое можно было использовать, т.к. то что Антон говорит - "просто написать контейнер" - это неделя работы минимум хорошего программиста в моей команде, а новичок может и напишет быстрее, только потом переписывать придется.
@AntonyPolukhin
@AntonyPolukhin 6 месяцев назад
Все примеры есть в фреймворке userver. Он опенсорсный и есть на гитхабе. Там даже есть часть universal, которая не используетткорутины и применима в любом проекте
@user-on1rf1oj9z
@user-on1rf1oj9z 6 месяцев назад
Самый правильный тип программистов - "ленивые неленивые программисты" - лучше потратить время на удобные инструменты (типы/структуры данных), а потом быстро их использовать )
@sunheretic13
@sunheretic13 16 дней назад
TrivialBiMap или похожее решение не помешало бы в какой boost засунуть
@user-mi8es4ur5w
@user-mi8es4ur5w 6 месяцев назад
lazy prvalue - огонь!
@donutsleader
@donutsleader 6 месяцев назад
Если вы все равно используете кодогенерацию, почему не скодогенерить функции трансляции енума в строку и обратно вместо этой БиМапы? Не нужно будет полагаться на оптимизацию компилятора, которая внезапно не отломается. За одно и в дебаге будет работать все. А еще и бонусом будет ускорение компиляции и меньше "мусорных" impl-символов )
@MakarenkoSasha
@MakarenkoSasha 6 месяцев назад
им же было скучно ))
@AntonyPolukhin
@AntonyPolukhin 6 месяцев назад
Потому что тогда надо описать в "птичеьм языке" маппинг энума, настроить сборку на запуск кодгена или закомитить результаты и настроить проверки что закомиченное не разехалось... Или можно просто воспользоваться TrivialBiMap прям из C++ кода
@donutsleader
@donutsleader 6 месяцев назад
@@AntonyPolukhin принимается ) Однако птичим языком может быть просто хедер, в котором этот энум и задефайнен ) Кстати добиться такого уровня оптимизации, чтобы целиком избавиться от вызова bcmp из bool operator==(std::string_view,...) на годболте у меня не вышло (clang). Для самописного view - получилось, но не прямо до сравнения с интами, только до санролленых побайтовых сравнений.
@silversailor7077
@silversailor7077 Месяц назад
А чем deque хуже FIxedArray?
@vladimir0rus
@vladimir0rus 6 месяцев назад
Проблему необходимости копирования старых данных при увеличении размера массива можно решить очень элегантно, если знать как работает виртуальная память. Просто сразу создавайте массив максимальной длинны, с большим запасом, что бы его никогда не пришлось расширять. Пока вы не записали в него все данные он будет потреблять ровно столько памяти сколько в него было записано. Только не забудьте что инициалзировать по старинке его нельзя и вектор тут не подойдет, он попытется инициализировать всю память и умрет. UPD: поскольку не до всех дошло очевидное, массив конечно же надо не на стеке создавать, а аллоцируя память в куче (malloc/new). И речь идет о больших объемах, а не о сотне элементов (когда у вас расширение вектора уже создает проблему).
@vladimir0rus
@vladimir0rus 6 месяцев назад
@Red_Paper6495 бери 10ТБ не ошибешься.
@MsGordon01
@MsGordon01 6 месяцев назад
Никогда так не делайте. Человек не полностью понимает как работает виртуальная память. Только лишь в very happy path это будет работать. На самом деле jemalloc и так умеет расширять размер аллокации без перемещения, соответствующий код легко находится в исходниках. Тут дело другое: семантике с++ на все это совершенно наплевать.
@vladimir0rus
@vladimir0rus 6 месяцев назад
@@MsGordon01 ну давай расскажи всем как виртуальная память работает и что не так в аллокации памяти с запасом. Или ты не понял каким образом нужно память выделить?
@vladimir0rus
@vladimir0rus 6 месяцев назад
@Red_Paper6495 возьми 10ТБ, не прогадаешь
@vladimir0rus
@vladimir0rus 6 месяцев назад
@Red_Paper6495 почему именно новореги такие хамло?
@user-dx2iw1hm3d
@user-dx2iw1hm3d 5 месяцев назад
Кто-нибудь может написать версию линкера и платформу, под которой не ловится дублирование символов. Мб я составляю маленькие примеры но мне линкер всегда выдает ошибку при попытке слинковать файлы, которые определяют функции, совпадающие по сигнатуре.
@milbrus735
@milbrus735 6 месяцев назад
Может быть примеры неудачные, но наличие мьютекса и отсутствие конструкторов как бы намекают на использование std::shared_ptr. Лет 10 назад написал на хабре "JSON-сериализатор на быстрых шаблонах", так он весь построен по принципу как у вас enum, правда он ещё на 03 стандарте и enum там тоже есть и флаги, когда int представленный как A|B|C сериализуется (и десереализуется, разумеется) либо в строчку "A|B|C" лобо в массив ["A", "B", "C"], до сих пор используем во всех проектах
@AntonyPolukhin
@AntonyPolukhin 6 месяцев назад
Да можно воспользоваться `std::shared_ptr` или `std::unique_ptr` передав в них `new third_party_lib::Something{third_party_lib::Something::Create()}`. Но это добавит индирекцию и лишнюю динамическую аллокацию на каждый объект
@MAKCIM666
@MAKCIM666 6 месяцев назад
@@AntonyPolukhin А делали замеры на реальный прирост производительности от внедрения ленивого prvalue? Понятное дело, это приятно, когда ты делал-делал трюк и он внезапно заработал, да ещё и как надо, но когда речь идёт о 2us против 3us на массиве из 100 500 объектов при типичном использовании массивов на 42 объекта - овчинка, очевидно, выделки не стоит.
@AntonyPolukhin
@AntonyPolukhin 6 месяцев назад
@@MAKCIM666 LazyPrvalue у нас в частности используется при порождении асинхронной таски, и спасает от лишней динамической аллокации. То есть на каждый запрос убирает в среднем 1мкс и экономит пару сотен байт оперативной памяти до границы корзинки аллокатора (там два больших объекта, поэтому счёт именно на сотни байт)
@daniel3780
@daniel3780 6 месяцев назад
Пример с бимапой это какой стандарт? 20 говорит "не хочу constinit вместе с explicit".
@mpmuradov
@mpmuradov 6 месяцев назад
получается, что case insensitive сравнение строк в trivialbimap не даст уже скорости за счет сравнения строк по 4-8 байт?
@user-on1rf1oj9z
@user-on1rf1oj9z 6 месяцев назад
Строчки, наверное, ограничиваются ascii таблицей, там lowercase просто and с константой
@patlecat
@patlecat 5 месяцев назад
Do videos in English on uServer pls
@CUserGroupRussia
@CUserGroupRussia 5 месяцев назад
Hello! You can turn on subtitles and choose auto-translate in English.
@patlecat
@patlecat 5 месяцев назад
@@CUserGroupRussia ok but it would be great to have some vids in English too and most importantly some tutorials!
@patlecat
@patlecat 5 месяцев назад
@@CUserGroupRussiaThe translation here is not good, I can barely follow the talk a lot of information is lost.
@VitaliyAksyonov
@VitaliyAksyonov 6 месяцев назад
В который раз убеждаюсь, что C++ пошёл куда-то не туда. Вместо того, чтобы просто писать код, надо придумывать костыли, которые обходят другие костыли, котоыре уже принесли разработчики стандарта, когда обходили свои же костыли из предыдущих версий.
@grincha09
@grincha09 5 месяцев назад
И js с собой за ручку повел
@TheInspctrcat
@TheInspctrcat 6 месяцев назад
Плюсовики изобрели слайсы что ли?
@MsGordon01
@MsGordon01 6 месяцев назад
Послушал с интересом и ушёл дальше разрабатывать на расте
@user-yx2tt2sv6h
@user-yx2tt2sv6h 6 месяцев назад
В яблочко )
@gosuwebwizard
@gosuwebwizard 6 месяцев назад
за копеешную зарплату ребята херачат.... ((((
@Max-ob8gq
@Max-ob8gq 6 месяцев назад
печальная участь всех с++ программистов. больше всех знают о программировании и операционных системах и получают меньше всех
@gosuwebwizard
@gosuwebwizard 6 месяцев назад
и что там?@Red_Paper6495
@gngrinboxru
@gngrinboxru 6 месяцев назад
С такими талантами и работать на яндекс в 2024 году это просто позор.
@zlatoust4444
@zlatoust4444 6 месяцев назад
Так они не работают, а извращаются, в лекции как раз об этом😅
@zlatoust4444
@zlatoust4444 6 месяцев назад
Не понравилось. Если приходится в такие дебри лезть- то это уже не программирование, а извращения. Ну Яндекс под Кудриным верной дорогой идет.
@IExSet
@IExSet 6 месяцев назад
ЛОЛ. Программирование всегда было извращением (кучей хаков, трюков, узких мест и т.п.), иначе это не программирование, а скриптование 🙂
@sigasigasiga
@sigasigasiga 4 месяца назад
41:21 жаль только, что Антон забыл сказать о том, что weak_ptr от такого указателя лучше не конструировать😅
Далее
Антон Соснин - С++ в мемах
1:04:21
Просмотров 7 тыс.
The Pointer to Implementation (pImpl) idiom in C++
6:54
Корутины
1:51:55
Просмотров 14 тыс.