Один микросек - C++, low latency, concurrency, HFT
822 subscribers
10 photos
2 videos
42 links
Download Telegram
Ребят, это, конечно, маловероятно, но я попробую закинуть удочку:

Кто-нибудь проходил Яндекс Практикум по C++ в 2022-2024? Я ищу реальные отзывы о современной версии курса, и хотел бы задать пару вопросов, чтобы выработать для себя оценку курса. (для чего это нужно, скоро напишу)

Для связи: @yukigaru
Один микросек - C++, low latency, concurrency, HFT
Ребят, это, конечно, маловероятно, но я попробую закинуть удочку: Кто-нибудь проходил Яндекс Практикум по C++ в 2022-2024? Я ищу реальные отзывы о современной версии курса, и хотел бы задать пару вопросов, чтобы выработать для себя оценку курса. (для чего…
Рассказываю, зачем я это спрашивал. Я иногда заглядываю в чаты по C++, и периодически вижу новичков, которые приходят с одним и тем же вопросом вида "посоветуйте как изучать C++", "что почитать по C++ новичку" или "посоветуйте хороший курс". Подумал "а сделаю-ка я свой гайд", перечислю там материалы, которые на мой взгляд подходят на этом сложном пути изучения плюсов.

Сказано, git init'чено. Написал общие слова про обучение, чтение статей, просмотр ютуба, менторство, и т.п. Осталось самое сложное: перечислить курсы и книги. Как-то давно я проходил otus, но ни разу не видел курсы от яндекса, поэтому спросил у вас про них. А книги (обычно рекомендуемые) вчера перелистывал. Хорошую (на мой вкус) книгу было сложно найти, потому что:
- Для многих книг C++11 это просто - дополненное издание, а сама книга так и остаётся в стиле C++03.
- В отличие от курсов, книги строятся по принципу "перечислю в этой главе всё, что есть". Поэтому они больше справочники, и не ставят себе цели плавно вводить в язык.

Репа с гайдом: https://github.com/Yukigaru/learn-cpp-recommendations
Буду благодарен за комментарии.
Один микросек - C++, low latency, concurrency, HFT
Ребят, это, конечно, маловероятно, но я попробую закинуть удочку: Кто-нибудь проходил Яндекс Практикум по C++ в 2022-2024? Я ищу реальные отзывы о современной версии курса, и хотел бы задать пару вопросов, чтобы выработать для себя оценку курса. (для чего…
Что почитать по разработке и плюсам?

1) Обсуждение std::deque на Reddit. Из интересного: разработчик из MS, взявший на себя ответственность за размер аллоцируемого блока равный 16 байтам (жесть, конечно, что в него влезет?).

2) Стоит ли продолжать развиваться в программировании в 60 лет. Оцените количество бодрых 60-летних, которые продолжают развиваться. Меня это заряжает, т.к. я хочу программировать еще долго.

3) [hard] Статья про Linux HugePages для минимизации затрат на TLB cache misses. Напрямую не использовал, но видел использование в DPDK.

4) [easy] Не надо проверять результат malloc'а assert'ом от PVS.

5) [easy] Как всё обернуть в RAII с помощью unique_ptr.

5) Почему не стоит приносить корповые практики в инди разработку. Frontend framework 2025 года, Kubernetes, scrum master'а, ретроспективы, это про вас!
👍3🔥3
https://www.youtube.com/watch?v=gl_Ikc_tOe4

^^ ооо как интересно! Я раньше очень любил демосцены, смотрел их по много раз, хранил на диске. Но никогда не видел код и не разбирался в них. Для меня это было что-то сложное и непонятное. Это был год, наверное, 2003. С тех пор давно не смотрел, но ностальгия простреливает при просмотре доклада. Смотрю...
Привет! Я готовлю онлайн воркшоп по std::condition_variable на C++ Russia, который пройдёт в мае. Это практический вебинар, в котором после небольшого теоретического введения, вам нужно будет писать C++ код, компилировать и запускать у себя локально, но прямо во время воркшопа. На данный момент подтверждения участия еще нет, но я готовлю и улучшаю материал.

Это будет мой первый подобный опыт, и мне нужно сделать несколько тестовых прогонов, после которых я буду улучшать программу воркошопа (код, слова, план, тайминги, дикцию и т.п.). Я ищу добровольцев, которые поучаствуют на ~1.5ч в ближайшую субботу (в 20:00 gmt+3). Напишите в личку @yukigaru, пожалуйста, если вам интересно мне помочь в этом.

Для кого:
- сам воркшоп для всех, кому интересен практический опыт в C++ concurrency.
- тестовый прогон для всех, кто готов помочь, поучаствовать и дать обратную связь (т.е. не обязательно для новичков в теме).
👏6
Один микросек - C++, low latency, concurrency, HFT
Как-то был у нас класс с несколькими мьютексами: std::mutex _m_one; // field1 // field2 std::mutex _m_two; // field3 // field4 Когда мьютексов в одном месте становится больше одного, и в целом полей много, нужно как-то разграничивать и показывать: - Что чем…
Тут в канале "C++ User Group" вышел доклад, в котором автор предлагает идею SharedState класса для согласованного синхронизированного доступа к данным, что очень похоже на MutexProtected из предыдущего поста, но добавляет еще wait/notify семантику. Код на sourceforge. Подождите, где где?

В целом, мне нравится, попробую в каком-нибудь pet project'е.
👍1
Один микросек - C++, low latency, concurrency, HFT
Привет! Я готовлю онлайн воркшоп по std::condition_variable на C++ Russia, который пройдёт в мае. Это практический вебинар, в котором после небольшого теоретического введения, вам нужно будет писать C++ код, компилировать и запускать у себя локально, но прямо…
Ура, в субботу предстоит тестовый прогон, в результате которого комитет решит, брать или не брать. Мы набрали ~13 человек, очень неплохо. Трое пришли через канал, и я вас очень рад видеть.

Один человек в supapro.cxx чате сказал "не слишком ли просто для cpprussia"? Для кого-то просто, для кого-то нет, пусть решит комитет. В cppcon есть секция "back to basics", и они не стесняются объяснять базовые вещи. Для тех, кто решает всё быстро, постараюсь дать усложнение: подзадача со звёздочкой. Если успеем за два часа, то будет 7 задач, и 1-2 в качестве домашнего задания.
🔥5
Первый прогон материала завершён, по моим ощущениям, успешно. Решения программного комитета пока еще жду. А пока собрал мнения, идеи по улучшению материала, понял где надо улучшать, над чем работать:

- Перейти с C++11 на C++17 (на всякий случай я заложил стандарт постарее).
- Вместо std::deque использовать std::queue адаптер.
- Разобраться с 2-3 задачами, как их представить получше. Сейчас не понятно, зачем их решать.
- Добавить wait с предикатом, но не сразу.
- Попробовать продемонстрировать spurious wakeup.
- Работать над дикцией и голосом. Повышать уверенность.
- Исправить: текущее форматирование не совпадает с .clang-format'ом.
- Запускать многопоточные юнит-тесты много раз, т.к. планирование потоков недетерминированное.
- Добавить CTest.
- Добавить 1-2 дополнительных задачи.

Репозиторий: https://github.com/Yukigaru/cpprussia-workshop-condition-variable
🔥7
Недавно мне задали вопрос:
> Какие ресурсы мог бы посоветовать, чтобы научится нужным скилам к собесу в High Frequency Trading компанию?

Подумал и составил небольшой список:

- Книга "Building low latency applications with C++", Sourav Ghosh, платно.

- Книга "Performance Analysis and Tuning on Modern CPUs", Denis Bakhvalov, бесплатно.

- Книга "C++ High Performance, 2nd edition", Bjorn Andrist, Viktor Sehr.

- Книга "Optimizing C++", Agner Fog, бесплатно.

- Блог Henrique Bucher, платно, но есть нюанс.

- Видео-лекции от Константина Владимирова.

- Интересуйся темами: networking (tcp, udp, multicast, tls, dns, http, websocket), concurrency, data oriented programming, IPC, shared memory, все про работу CPU, кэши, виртуальная память, аллокаторы, SIMD, time-series databases, perf profiling, хэширование, хэш-таблицы, heap, b-tree, ring buffer, intrusive containers, sorting алгоритмы.

- Изучай и практикуй тулзы: strace, ltrace, lsof, ss, objdump, netstat, tcpdump, nc, curl, websocat, ssh, perf, gdb/lldb, sanitizers. Не спрашивают, но необходимо в работе.

- Если нанимаешься в крупную/известную компанию, то просмотри все их технические лекции и доклады. Почитай их annual report за последние 2 года.

- Почитай в Glassdoor, какие вопросы они задают на собесах.

Однако, всё это и не требуется. Тебя возьмут, если хорошо ответишь на типовые сложные C++ вопросы и решишь все algo задачи. Этот пост про дополнительные материалы, которые настраивают тебя в нужном направлении, и заметно увеличивают шансы (попасть хоть куда кстати).
🔥10👍31😱1😨1
Один микросек - C++, low latency, concurrency, HFT
Недавно мне задали вопрос: > Какие ресурсы мог бы посоветовать, чтобы научится нужным скилам к собесу в High Frequency Trading компанию? Подумал и составил небольшой список: - Книга "Building low latency applications with C++", Sourav Ghosh, платно. - Книга…
В продолжение предыдущего поста: был ещё вопрос "какие пет-проджекты можно поделать, чтобы на собесе это зачлось". Я подумал, и написал одну задачу (даже целый проект по объему), субъективно наиболее подходящую для инженера в core команду. Это не гарантирует успеха, и одновременно не является необходимым, но может помочь получить подходящие знания, доверие от интервьювера или вашу уверенность в общении.

Задача: разработать готовый к использованию механизм для shared memory IPC с минимальными задержками на передачу данных. Продумайте:
- как связывать между собой два процесса, по какому пути/ключу/id
- как сериализовать сложные структуры
- способ нотификации другого процесса о записанных данных, и синхронизации чтения и записи
- масштабирование: как будет работать механизм при увеличении количества читателей
- обработка падений и читателя и писателя
- версионирование
- обработку ошибок
- тесты
- обработку переполнений буферов
- запись метрик (время [де]сериализации, время реакции) в прометеус
- сравнить с другими 1-2 способами IPC в Linux
- сравнить с другими реализации на github
👍6
В HFT торговая система способна выставлять заявки с бешеной скоростью, и одна ошибка в коде (вплоть до одного неверного символа) может привести к быстрому сливу активов, принудительной ликвидации или штрафу от брокера/биржи/регулятора.

В 2012 году Knight Capital были самой крупной трейдинговой фирмой на американском рынке. Компанию строили 17 лет, в ней было состредоточено большое кол-во технологий, и все это было слито за час, 1-го августа 2012-го года, из-за серии ошибок в тех. процессах. Их система вошла в нежелательные позиции по ~150 stock'ам на общую сумму в $7 млрд. Впоследствии от позиции избавились с общими потерями в $440 млн, а компанию поглотил конкурент.

Читаем в оригинале.
👍4😁1😢1
Один микросек - C++, low latency, concurrency, HFT
Первый прогон материала завершён, по моим ощущениям, успешно. Решения программного комитета пока еще жду. А пока собрал мнения, идеи по улучшению материала, понял где надо улучшать, над чем работать: - Перейти с C++11 на C++17 (на всякий случай я заложил…
🎉 Ура, приняли в программу "C++ Russia"! Сам поверить не могу. Ну штош, буду готовиться и улучшать материал.

Несколько лет назад, когда я работал в gamedev'е, я впервые пошел на "C++ Russia". Там узнал, что жизнь за пределами игровой индустрии существует, после чего сменил работу, и это дало мне большой толчок в развитии. Fun fact: на конфе был стенд с вакансиями, я его отфоткал, и забыл. Спустя 4 года случайно нашел фотографию, и понял, что оказался именно в той компании, которую заприметил. Жаль, что не пошёл туда раньше 😅.
🔥13👍1
Есть один очень мощный разработчик и исследователь Daniel Lemire (Блог, Github, X). Помимо прочего, он подарил нам simdjson, состоящий полностью из магии шаблонов, магии битовой арифметики, и магии SIMD.

В этом докладе Daniel рассказывает уроки, полученные при разработке библиотеки: https://www.youtube.com/watch?v=wlvKAT7SZIQ:
Что можно делать и не делать для ускорения парсинга, как избегать branch mispredictions, как ускорить валидацию utf-8, классификацию символов, обработку escape characters, про дорогой парсинг чисел, и про runtime dispatcing по архитектуре. Видео из 2019 года, с тех пор Даниэль и мейнтейнеры провели еще немало оптимизаций.

Если ты хорошо знаешь свои данные, то ты можешь достичь ещё большей скорости. Например, за счёт:
- шаблонных парсеров, настраиваемых на конкретное нюансы конкретного json'а
- знания структуры документа
- знания, что не будет unicode символов
- знания, что не будет whitespaces между значимыми символами
- знания, что не будет escape characters (\)
- пропуска ненужных тебе полей или всего сообщения (при определенных условиях)
- использования доп. потоков (пример)

Конечно, это не подходит для библиотек, для клиентских приложений, это очень хрупко, и не всегда парсинг json является самым узким местом.
🔥5👍2
Что почитать по C++ и разработке в целом?

1) Список замен для традиционных unix-way утилит от Julia Evans. Из предложенного я пробовал exa (норм), mosh (хорошо), fzf (отлично), lnav (отлично). Lnav - mush-have для анализа и просмотра логов. Жаль, он недостаточно хорошо оптимизирован для 5Gb+ файлов.

2) Ускорение binary search с помощью SIMD от Сергея Слотина. А казалось, бинарный поиск максимально простой, где там еще оптимизировать?

3) Новинки, попавшие в черновик стандарта C++26 от Антона Полухина, а так-же предыдущая статья на эту тему. Мне особенно понравились _ и RCU.

4) Jane Street рассказывают про свою open-source утилиту Magic-Trace (на ocaml), которая умеет собирать и обрабатывать Intel PT события. Как возникнет необходимость, попробую.

5) Low-latency optimizations: Huge Pages part I от Hudson River.
👍12
Застали падение на крипто рынке? Альты сходили на минус 20-30%. В такие моменты сервера работают с повышенной нагрузкой, траффик с бирж сильно растёт, задержки приходящих пакетов увеличиваются (т.к. биржи не вывозят шквал заявок), а технология проходит настоящую проверку. Частота сердечных сокращений повышается, и HFT сотрудники приходят за свои дески.
👍8
Что почитать по C++ и разработке в целом?

1) [middle] connect() - why are you so slow от Cloudflare.

2) [middle] How to stop Linux threads cleanly.

3) [middle] Semaphores are surprisingly versatile. Жаль, Preshing больше не пишет. Хорошие у него были гайды по concurrency и lock-free.

4) [middle] What a software developer must know about Unicode in 2023. Первый раз встречаю блог, но оформлен он очень круто. Стоит заглянуть.

5) [beginner] Видео от Jason Turner о безопасном использовании std::string_view.
👍8🔥21
Реализовывал подпись транзакций для одной из DEX бирж. Согласно питонячему примеру, мне нужно было сначала сериализовать сообщение msgpack'ом (популярный бинарный формат для сериализации), потом посчитать от него хэш, потом положить его в структуру, опять посчитать хэш по стандарту EIP-712, и наконец подписать. Сама биржа не документирует как делать подпись (ну правильно, зачем), а просто отсылает к реализации подписи на Python. В примере на python делается примерно следующее (это только часть):
msg = {"pair_id": pair_id, "is_buy": is_buy, "price": str(price), "size": str(size)}
packed = msgpack.packb(msg)
hash = keccak256(packed)


Msgpack умеет сериализовывать и питонячьи и C++ контейнеры, но ассоциативные массивы сериализует в порядке их обхода, а порядок обхода со времён Python 3.7 стал insertion-order (т.е. в том порядке, в каком были вставлены в dict, независимо от самого значения ключа). При портировании этого кода на C++ я сначала сериализовал std::map<std::string, msgpack::object>, что давало другой порядок (не insertion, а sorted), и соответственно другой хэш (а значит транзакция будет отклонена). Unordered_map тоже не подходит, он же "unordered". Немного поворчав, взял низко-уровневый C API, позволяющий сконструировать map вручную в нужном порядке:
msgpack_pack_map(p, 4);
msppack_pack_str(p, "pair_id");
msppack_pack_int(p, pair_id);
msppack_pack_str(p, "is_buy");
msppack_pack_bool(p, is_buy);
...


Возвращаясь к питону и insertion-order: изменение добавили в СPython в качестве оптимизации (а я как-то подзабыл эту новость 7 летней давности, хотя слышал). Внутри двойная структура: первая - хэш-таблица, содержит в качестве значений не сами элементы, а индексы во второй структуре, являющейся массивом (куда значения как раз попадают в insertion порядке). Это обеспечивает ускорение итерации, и стабильный порядок обхода (что довольно приятно в некоторых ситуациях), и уменьшенный memory footprint (за счёт уменьшения хэш-таблицы).

Здесь мейнтейнер питоняки Raymond Hettinger рассказывает подробнее, как эволюционировала реализация:
www.youtube.com/watch?v=p33CVV29OG8
Довольно интересно.
👍62
В выходные готовился к воркшопу на C++ Russia 2024: продумывал как лучше объяснять, куда вставить различные нюансы, фишки, объяснения багов, дописывал нюансы в коде, добавлял readme, добавлял опциональные задачи, добавлял комментарии, улучшал тесты, копал тему еще глубже. Репозиторий пока скрыт, но по плану я открою его за сутки до начала.
В рамках воркшопа участники напишут Queue, Latch, RWLock. В качестве "домашнего задания" останется: написать свой Condition Variable на Futex'ах (непростая задача), и Thread Pool на основе написанного Queue. Ближайшие несколько постов будут про воркшоп.
👍65
Я вернулся из отпуска и командировки, отдохнул и готов писать дальше. Что произошло за три недели?

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

Во-вторых, похоже, что один из преподов OTUS'а решил спиздить вдохновиться воркшопом. Об этом расскажу в следующем посте.

В-третьих, мы в своей небольшой команде выходим на новую крипто-полу-defi-биржу. Это интересное время, которое очень драйвит. Однако результата легко и быстро не получить. Первая реализация обычно не даёт денег, и требует дальнейшей долгой настройки, бэктестов, оптимизаций и исследований.
👍8
Теперь об OTUS'е и воркшопе. Как-то случайно я зашел в какой-то плюсовый канал и увидел рекламу открытого вебинара на знакомую тему "Условные переменные". "Интересно посмотреть о чем они расскажут" подумал я, перешёл на сайт и сильно удивился. Текст с описанием вебинара был очень и очень похож на тот, который я писал ранее. Сравните сами на скриншотах.

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

Репозиторий с задачами, если интересно: https://github.com/Yukigaru/cpprussia-workshop-condition-variable
🤬12😢1
Один микросек - C++, low latency, concurrency, HFT
Теперь об OTUS'е и воркшопе. Как-то случайно я зашел в какой-то плюсовый канал и увидел рекламу открытого вебинара на знакомую тему "Условные переменные". "Интересно посмотреть о чем они расскажут" подумал я, перешёл на сайт и сильно удивился. Текст с описанием…
Со мной связались представители OTUS и сказали, что преподаватель увидел рекламу воркшопа, а потом затеял свой, и описание похоже, потому что "базовые составляющие этой темы плюс минус одни". Говорят, контент будет уникальным. Считаю, вопрос закрыт.
🥴10👍6😐1