Открытие дня: некоторые спрятанные под paywall статьи с Substack могут быть получены через Pocket (приложение для скрейпинга статей в удобо-читаемый формат).
Например, так я почитал платную статью "Stop measuring time", где автор предлагает измерять длительность циклами процессора, а не временем, потому что замеры времени:
- имеют больший latency (самого замера)
- имеют больший jitter
- несравнимы для разных частот ядра (а частота легко может меняться)
Я как-то раз пробовал замерять кол-во циклов, всё хорошо, но непривычно. Мозг привык оперировать нано/микросекундами, и 12.3 микросекунды воспринимается проще, чем 37240 циклов.
Например, так я почитал платную статью "Stop measuring time", где автор предлагает измерять длительность циклами процессора, а не временем, потому что замеры времени:
- имеют больший latency (самого замера)
- имеют больший jitter
- несравнимы для разных частот ядра (а частота легко может меняться)
Я как-то раз пробовал замерять кол-во циклов, всё хорошо, но непривычно. Мозг привык оперировать нано/микросекундами, и 12.3 микросекунды воспринимается проще, чем 37240 циклов.
👍3
Если бы C++ придумали в СССР:
Компилируется и работает: пруф. Но есть нюанс...
шаблон<класс Переборщик>
ничего_не_возвращай отсортируй(Переборщик первый, Переборщик крайний)
{
если (первый == крайний)
верни;
авто пивот = *следующий(первый, расстояние(первый, крайний) / 2);
авто серединка1 = раздели(первый, крайний, [пивот](нетрогай авто& эм) {
верни эм < пивот;
});
авто серединка2 = раздели(серединка1, крайний, [пивот](нетрогай авто& эм) {
верни !(пивот < эм);
});
отсортируй(первый, серединка1);
отсортируй(серединка2, крайний);
}
цел main() {
массив<цел> в1 = {9, 5, 7, 1};
отсортируй(в1.начало(), в1.конец());
для (авто в : в1) {
печать << в << " ";
}
верни 0;
}
Компилируется и работает: пруф. Но есть нюанс...
godbolt.org
Compiler Explorer - C++ (x86-64 gcc 13.2)
template <typename T>
using массив = std::vector<T>;
using цел = int;
#define авто auto
#define верни return
#define нетрогай const
#define ничего_не_возвращай void
#define если if
#define печать std::cout
#define для for
#define шаблон template
#define класс…
using массив = std::vector<T>;
using цел = int;
#define авто auto
#define верни return
#define нетрогай const
#define ничего_не_возвращай void
#define если if
#define печать std::cout
#define для for
#define шаблон template
#define класс…
🗿2🔥1
Новая рубрика в канале: "Random job interview shit", другими словами, вопросы с собеседований, как хорошие, так и всратые.
1) Что будет результатом выполнения?
2)Как результат зависит от размера строки `s`?
1) Что будет результатом выполнения?
std::string s = "1234567890123";
std::string_view sv = s + "456";
std::cout << sv;
2)
Один микросек - C++, low latency, concurrency, HFT
Если бы C++ придумали в СССР: шаблон<класс Переборщик> ничего_не_возвращай отсортируй(Переборщик первый, Переборщик крайний) { если (первый == крайний) верни; авто пивот = *следующий(первый, расстояние(первый, крайний) / 2); авто серединка1…
Кстати, это тоже рабочая C++ программа:
ссыльк
🌘<🛟 👕>
🪴 💬(👕 🥄, 👕 😮)
{
🥹 (🥄 == 😮)
🙀;
🦊 😄 = *🥩(🥄, 🏛(🥄, 😮) / 2);
🦊 🚾 = 🍆(🥄, 😮, [😄](🐒 🦊& 👽) {
🙀 👽 < 😄;
});
🦊 🧠 = 🍆(🚾, 😮, [😄](🐒 🦊& 👽) {
🙀 !(😄 < 👽);
});
💬(🥄, 🚾);
💬(🧠, 😮);
}
🧧 main() {
🎮< 🧧> 🥃 = {9, 5, 7, 1};
💬(🥃.🎈(), 🥃.🎋());
🏪 (🦊 🎃 : 🥃) {
🎄 << 🎃 << " ";
}
🙀 0;
}
ссыльк
godbolt.org
Compiler Explorer - C++ (x86-64 gcc 13.2)
template <typename T>
using 🎮 = std::vector<T>;
using
🧧 = int;
#define 🦊 auto
#define 🙀 return
#define 🐒 const
#define 🪴 void
#define 🥹 if
#define 🎄 std::cout
#define 🏪 for
#define 🌘 template
#define 🛟 class
#define 🎈 begin
#define 🎋 end
template<typename…
using 🎮 = std::vector<T>;
using
🧧 = int;
#define 🦊 auto
#define 🙀 return
#define 🐒 const
#define 🪴 void
#define 🥹 if
#define 🎄 std::cout
#define 🏪 for
#define 🌘 template
#define 🛟 class
#define 🎈 begin
#define 🎋 end
template<typename…
🌚2☃1😁1
Интересный тред на Reddit: какие самые малоизвестные и удивляющие элементы C++ вы узнали?
Например:
1) Функция может начинаться с try/catch блока и не иметь своих скобок:
2) В std есть аж три сущности с именем
3) А как вам функция get_money в стандартной библиотеке? Это именно то, что делают C++ программисты, - гребут деньги.
4) Это работает:
В общем, там много интересного. Что мне нравится в Reddit, там не принято умничать. Если кто-то напишет: "я недавно узнал про placement new, это взорвало мне мозг", на него не накинутся гении программирования с критикой, только поддержат.
Например:
1) Функция может начинаться с try/catch блока и не иметь своих скобок:
void foo(int i)
try {
// do stuff
} catch (...) {
// more stuff
}
2) В std есть аж три сущности с именем
move
. Один всем известный move, который, на самом деле, ничего не перемещает, а другой как раз наоборот перемещает, не говоря уже про третий move.3) А как вам функция get_money в стандартной библиотеке? Это именно то, что делают C++ программисты, - гребут деньги.
4) Это работает:
int and foo = std::move(another);
В общем, там много интересного. Что мне нравится в Reddit, там не принято умничать. Если кто-то напишет: "я недавно узнал про placement new, это взорвало мне мозг", на него не накинутся гении программирования с критикой, только поддержат.
Reddit
From the cpp community on Reddit
Explore this post and more from the cpp community
👍2
Как-то был у нас класс с несколькими мьютексами:
Когда мьютексов в одном месте становится больше одного, и в целом полей много, нужно как-то разграничивать и показывать:
- Что чем защищается. Чтобы было сложнее перепутать и использовать _m_one для field3/4.
- Что не защищается мьютексом.
- Что к этим полям нельзя обращаться без мьютекса.
Я тогда делал это форматированием, т.е. сначала писал мьютекс, а потом без пробелов все поля, которые с ним используются (прямо как на примере выше). Иногда добавлял комментарий. А как иначе?
И тут на помощь приходит идея MutexProtected - паттерн, в котором к полю нельзя обратиться без мьютекса, а при обращении мьютекс блокируется автоматом. Набросал тестово: https://godbolt.org/z/jPG33vxGG
std::mutex _m_one;
// field1
// field2
std::mutex _m_two;
// field3
// field4
Когда мьютексов в одном месте становится больше одного, и в целом полей много, нужно как-то разграничивать и показывать:
- Что чем защищается. Чтобы было сложнее перепутать и использовать _m_one для field3/4.
- Что не защищается мьютексом.
- Что к этим полям нельзя обращаться без мьютекса.
Я тогда делал это форматированием, т.е. сначала писал мьютекс, а потом без пробелов все поля, которые с ним используются (прямо как на примере выше). Иногда добавлял комментарий. А как иначе?
И тут на помощь приходит идея MutexProtected - паттерн, в котором к полю нельзя обратиться без мьютекса, а при обращении мьютекс блокируется автоматом. Набросал тестово: https://godbolt.org/z/jPG33vxGG
awesomekling.github.io
MutexProtected: A C++ Pattern for Easier Concurrency
In this post, we will discuss the challenges of programming with locks and how the C++ language offers some useful tools to make it easier. We will start with an example in C and then use C++ to improve upon it in steps. The example APIs are based on real…
👍3🔥2
В CLion 2023.3 (да, я давно не обновлялся) заехала killer feature: Assembly view! Давно об этом мечтал, и даже подумывал написать подобный плагин для VS Code.
upd: Но есть нюанс. У меня сходу не взлетело на рабочем проекте, показывает только набор string literals 😅 Еще позже попробую, поднастрою, сборку подшаманю.
upd: Заработало. Это бомба!
upd: Но есть нюанс. У меня сходу не взлетело на рабочем проекте, показывает только набор string literals 😅 Еще позже попробую, поднастрою, сборку подшаманю.
upd: Заработало. Это бомба!
Джун-задачка, которая образовалась с реального случая на пред. работе:
Будет выведено 32119, почему?
#include <cinttypes>
#include <iostream>
uint64_t wtf() {
double d = 32120 / 1000.0;
return d * 1000.0;
}
int main() {
std::cout << wtf();
}
Будет выведено 32119, почему?
Вы пишете заметки? Ведёте базу знаний?
Мой путь в использовании приложений для заметок был таким: тетради → тетради со сменными страницами → Google Keep (в конце он похерил мне заметки) → Evernote (кратко) → Google Docs → Notion → Obsidian.
Сначала были тетради со своим набором недостатков: некрасивые исправления, иногда плохие ручки, меняющиеся шрифты. Но самое неудобное было то, что трудно было предугадать сколько страниц тебе понадобится на определенную тему. Приходилось закладывать несколько пустых страниц, которые не пригождались.
Потом появились тетради, у которых можно делать std::move страницам. Это вполне удобно: лишнее можно вырвать и заменить другим, перетасовать, уплотнить. Важно сразу закупить несколько штук (3-4), потому что через пару лет таких же тетрадей ты не найдешь. Но была одна серьезная проблема: я только писал в эти тетради, и никогда их не читал.
Так я на время перестал записывать знания по программированию и после недолгих экспериментов перешёл в Notion. Он был хорош для меня за счёт одной киллер-фичи: возможности перетаскивать блоки курсором мыши или пальцем на смартфоне. Но раздражал своей медлительностью: долго загружался.
Не так давно перешёл на Obsidian. Чем он хорош:
- Хранит файлы локально, и мне пришлось по душе это ощущение: мои данные лежат у меня, и доступны всегда. Мне не нужно думать о возможных санкциях, блокировках по IP, мириться с лагами.
- Загружается заметно быстрее Notion'а.
- Клавиатурно ориентирован и имеет shortcut'ы для быстрого доступа.
Перенёс туда всю информацию из Notion и различные доки из Google Docs, начал вести базу знаний по программированию и интересующим техническим темам. Только одно пока осталось в Notion: план на неделю, как раз из-за той фичи с перетаскиванием. Оказалось, именно планы чаще всего нужно перетаскивать на следующий день.
Что у меня лежит в обсиде:
- Cheatsheets - мои подсказки по командам и утилитам linux
- Знания по C++, Networking, Linux, System design, и прочее
- Бенчмарки, о которых писал ранее
- Резюме и заметки по прочитанным книгам
- Заметки по здоровью
- План для блога, черновики постов
- Различные списки (например, список книг на прочтение, фильмов на просмотр, напоминание что брать в перелёт и т.п.)
- Спонтанные заметки, записки, идеи
Мой путь в использовании приложений для заметок был таким: тетради → тетради со сменными страницами → Google Keep (в конце он похерил мне заметки) → Evernote (кратко) → Google Docs → Notion → Obsidian.
Сначала были тетради со своим набором недостатков: некрасивые исправления, иногда плохие ручки, меняющиеся шрифты. Но самое неудобное было то, что трудно было предугадать сколько страниц тебе понадобится на определенную тему. Приходилось закладывать несколько пустых страниц, которые не пригождались.
Потом появились тетради, у которых можно делать std::move страницам. Это вполне удобно: лишнее можно вырвать и заменить другим, перетасовать, уплотнить. Важно сразу закупить несколько штук (3-4), потому что через пару лет таких же тетрадей ты не найдешь. Но была одна серьезная проблема: я только писал в эти тетради, и никогда их не читал.
Так я на время перестал записывать знания по программированию и после недолгих экспериментов перешёл в Notion. Он был хорош для меня за счёт одной киллер-фичи: возможности перетаскивать блоки курсором мыши или пальцем на смартфоне. Но раздражал своей медлительностью: долго загружался.
Не так давно перешёл на Obsidian. Чем он хорош:
- Хранит файлы локально, и мне пришлось по душе это ощущение: мои данные лежат у меня, и доступны всегда. Мне не нужно думать о возможных санкциях, блокировках по IP, мириться с лагами.
- Загружается заметно быстрее Notion'а.
- Клавиатурно ориентирован и имеет shortcut'ы для быстрого доступа.
Перенёс туда всю информацию из Notion и различные доки из Google Docs, начал вести базу знаний по программированию и интересующим техническим темам. Только одно пока осталось в Notion: план на неделю, как раз из-за той фичи с перетаскиванием. Оказалось, именно планы чаще всего нужно перетаскивать на следующий день.
Что у меня лежит в обсиде:
- Cheatsheets - мои подсказки по командам и утилитам linux
- Знания по C++, Networking, Linux, System design, и прочее
- Бенчмарки, о которых писал ранее
- Резюме и заметки по прочитанным книгам
- Заметки по здоровью
- План для блога, черновики постов
- Различные списки (например, список книг на прочтение, фильмов на просмотр, напоминание что брать в перелёт и т.п.)
- Спонтанные заметки, записки, идеи
🔥3❤2👍2
Ребят, это, конечно, маловероятно, но я попробую закинуть удочку:
Кто-нибудь проходил Яндекс Практикум по C++ в 2022-2024? Я ищу реальные отзывы о современной версии курса, и хотел бы задать пару вопросов, чтобы выработать для себя оценку курса. (для чего это нужно, скоро напишу)
Для связи: @yukigaru
Кто-нибудь проходил Яндекс Практикум по 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
Буду благодарен за комментарии.
Сказано, 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'а, ретроспективы, это про вас!
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. С тех пор давно не смотрел, но ностальгия простреливает при просмотре доклада. Смотрю...
^^ ооо как интересно! Я раньше очень любил демосцены, смотрел их по много раз, хранил на диске. Но никогда не видел код и не разбирался в них. Для меня это было что-то сложное и непонятное. Это был год, наверное, 2003. С тех пор давно не смотрел, но ностальгия простреливает при просмотре доклада. Смотрю...
YouTube
Александр Кухаренко — Демосцена: в погоне за wow-фактором
Подробнее о конференции C++ Russia: https://jrg.su/9Sszhd
— —
Как написать программу, делающую «невозможное»? Как и чем удивляют зрителя (и друг друга) сценеры?
Ликбез по алгоритмам, принципам и архитектуре.
Целевая аудитория: программисты, знакомые с принципами…
— —
Как написать программу, делающую «невозможное»? Как и чем удивляют зрителя (и друг друга) сценеры?
Ликбез по алгоритмам, принципам и архитектуре.
Целевая аудитория: программисты, знакомые с принципами…
Привет! Я готовлю онлайн воркшоп по std::condition_variable на C++ Russia, который пройдёт в мае. Это практический вебинар, в котором после небольшого теоретического введения, вам нужно будет писать C++ код, компилировать и запускать у себя локально, но прямо во время воркшопа. На данный момент подтверждения участия еще нет, но я готовлю и улучшаю материал.
Это будет мой первый подобный опыт, и мне нужно сделать несколько тестовых прогонов, после которых я буду улучшать программу воркошопа (код, слова, план, тайминги, дикцию и т.п.). Я ищу добровольцев, которые поучаствуют на ~1.5ч в ближайшую субботу (в 20:00 gmt+3). Напишите в личку @yukigaru, пожалуйста, если вам интересно мне помочь в этом.
Для кого:
- сам воркшоп для всех, кому интересен практический опыт в C++ concurrency.
- тестовый прогон для всех, кто готов помочь, поучаствовать и дать обратную связь (т.е. не обязательно для новичков в теме).
Это будет мой первый подобный опыт, и мне нужно сделать несколько тестовых прогонов, после которых я буду улучшать программу воркошопа (код, слова, план, тайминги, дикцию и т.п.). Я ищу добровольцев, которые поучаствуют на ~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 Когда мьютексов в одном месте становится больше одного, и в целом полей много, нужно как-то разграничивать и показывать: - Что чем…
YouTube
Александр Корнилов — Идея по улучшению многопоточного кода
Подробнее о конференции C++ Russia: https://jrg.su/9Sszhd
— —
Александр описывает подход к написанию многопоточного кода, который помогает избежать типовых ошибок, связанных с использованием базовых примитивов синхронизации. Демонстрация идеи проходит на…
— —
Александр описывает подход к написанию многопоточного кода, который помогает избежать типовых ошибок, связанных с использованием базовых примитивов синхронизации. Демонстрация идеи проходит на…
Тут в канале "C++ User Group" вышел доклад, в котором автор предлагает идею SharedState класса для согласованного синхронизированного доступа к данным, что очень похоже на MutexProtected из предыдущего поста, но добавляет еще wait/notify семантику. Код на sourceforge. Подождите, где где?
В целом, мне нравится, попробую в каком-нибудь pet project'е.
В целом, мне нравится, попробую в каком-нибудь 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 в качестве домашнего задания.
Один человек в 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
- Перейти с 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 задачи. Этот пост про дополнительные материалы, которые настраивают тебя в нужном направлении, и заметно увеличивают шансы (попасть хоть куда кстати).
> Какие ресурсы мог бы посоветовать, чтобы научится нужным скилам к собесу в 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👍3❤1😱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
Задача: разработать готовый к использованию механизм для shared memory IPC с минимальными задержками на передачу данных. Продумайте:
- как связывать между собой два процесса, по какому пути/ключу/id
- как сериализовать сложные структуры
- способ нотификации другого процесса о записанных данных, и синхронизации чтения и записи
- масштабирование: как будет работать механизм при увеличении количества читателей
- обработка падений и читателя и писателя
- версионирование
- обработку ошибок
- тесты
- обработку переполнений буферов
- запись метрик (время [де]сериализации, время реакции) в прометеус
- сравнить с другими 1-2 способами IPC в Linux
- сравнить с другими реализации на github
👍6
В HFT торговая система способна выставлять заявки с бешеной скоростью, и одна ошибка в коде (вплоть до одного неверного символа) может привести к быстрому сливу активов, принудительной ликвидации или штрафу от брокера/биржи/регулятора.
В 2012 году Knight Capital были самой крупной трейдинговой фирмой на американском рынке. Компанию строили 17 лет, в ней было состредоточено большое кол-во технологий, и все это было слито за час, 1-го августа 2012-го года, из-за серии ошибок в тех. процессах. Их система вошла в нежелательные позиции по ~150 stock'ам на общую сумму в $7 млрд. Впоследствии от позиции избавились с общими потерями в $440 млн, а компанию поглотил конкурент.
Читаем в оригинале.
В 2012 году Knight Capital были самой крупной трейдинговой фирмой на американском рынке. Компанию строили 17 лет, в ней было состредоточено большое кол-во технологий, и все это было слито за час, 1-го августа 2012-го года, из-за серии ошибок в тех. процессах. Их система вошла в нежелательные позиции по ~150 stock'ам на общую сумму в $7 млрд. Впоследствии от позиции избавились с общими потерями в $440 млн, а компанию поглотил конкурент.
Читаем в оригинале.
Henricodolfing
Case Study 4: The $440 Million Software Error at Knight Capital
Knight Capital Group was an American global financial services firm engaging in market making, electronic execution, and institutional sal...
👍4😁1😢1