🎶 Библиотека для музыкальных векторов и алгоритмов
Vectors — это C++ библиотека для представления и манипуляции музыкальными структурами, такими как гаммы, аккорды и ритмы. Она предлагает мощные инструменты для музыкальных теоретиков и разработчиков, интересующихся алгоритмической музыкой.
🚀 Основные моменты:
- Унифицированные классы векторов для позиций, интервалов и бинарных паттернов
- Генераторы ритмов и мета-операторы для музыкальных объектов
- Матричные операции для анализа музыкальных структур
- Поддержка циклической и модульной арифметики
- Расчеты расстояний и схожести между музыкальными векторами
📌 GitHub: https://github.com/sivabenepoivediamo/vectors
Vectors — это C++ библиотека для представления и манипуляции музыкальными структурами, такими как гаммы, аккорды и ритмы. Она предлагает мощные инструменты для музыкальных теоретиков и разработчиков, интересующихся алгоритмической музыкой.
🚀 Основные моменты:
- Унифицированные классы векторов для позиций, интервалов и бинарных паттернов
- Генераторы ритмов и мета-операторы для музыкальных объектов
- Матричные операции для анализа музыкальных структур
- Поддержка циклической и модульной арифметики
- Расчеты расстояний и схожести между музыкальными векторами
📌 GitHub: https://github.com/sivabenepoivediamo/vectors
❤2
Прочитал у Вани Ходора, бэкендера из Лавки, пост про спекулятивное исполнение. Speculative execution — это мощный паттерн, где система предугадывает ваше следующее действие, заранее выполняя вычисления или подгружая данные.
В системном мире мы с этим живём постоянно. Процессоры уже десятилетиями предсказывают ветки кода, чтобы не простаивать. И именно поэтому они такие быстрые. Однако за эту высокую скорость пришлось платить — именно такой ценой появились уязвимости вроде Spectre. Даже железо может переусердствовать с догадками.
В прикладных системах то же самое:
спекуляция делает интерфейсы «мгновенными», но за кулисами идёт реальный перерасход. Предзагрузил слишком много — серверы греются, а пользователи даже не дошли до этой функции.
Я бы сказал так:
> спекулятивное исполнение — это ставка на интуицию машины.
> хорошо, когда она угадывает желания пользователя, плохо — когда начинает гадать.
В C++ подобные вещи ощущаются буквально: лишние вычисления, преждевременные аллокации, работа с кэшем — всё это цена «догадок». Если не знаешь, ради чего ускоряешь, то, скорее всего, просто сжигаешь ресурсы.
Speculative execution — крутой инструмент, но использовать его стоит только там, где задержка реально убивает UX или бизнес-метрику. В остальных случаях лучше просто сделать код лаконичным и быстрым.
В системном мире мы с этим живём постоянно. Процессоры уже десятилетиями предсказывают ветки кода, чтобы не простаивать. И именно поэтому они такие быстрые. Однако за эту высокую скорость пришлось платить — именно такой ценой появились уязвимости вроде Spectre. Даже железо может переусердствовать с догадками.
В прикладных системах то же самое:
спекуляция делает интерфейсы «мгновенными», но за кулисами идёт реальный перерасход. Предзагрузил слишком много — серверы греются, а пользователи даже не дошли до этой функции.
Я бы сказал так:
> спекулятивное исполнение — это ставка на интуицию машины.
> хорошо, когда она угадывает желания пользователя, плохо — когда начинает гадать.
В C++ подобные вещи ощущаются буквально: лишние вычисления, преждевременные аллокации, работа с кэшем — всё это цена «догадок». Если не знаешь, ради чего ускоряешь, то, скорее всего, просто сжигаешь ресурсы.
Speculative execution — крутой инструмент, но использовать его стоит только там, где задержка реально убивает UX или бизнес-метрику. В остальных случаях лучше просто сделать код лаконичным и быстрым.
Telegram
this->notes.
#highload
Есть такой паттерн speculative execution (⢄⠣⠌ ⠅⡠⢆⠒⢔⢄⢢⣀⠍ ⢃⠎⠚⡐⢰⡰⡰⡢⠲ ⢌⠥⠜⢅⠊⠃⡌⢈⡂⠰⡃ ⠡⡢ ⡅⠍ ⣄⡔⡘⡠⠉⠃⡆⢂⠓⠪⠩⢐⡠ ⡢⠩⢆⠱⠚⡡⢈⠦⡢⠕). Паттерн заключается в том, чтобы делать префетч данных ещё до того, как пользователь захочет что-то увидеть, чтобы в момент, когда он…
Есть такой паттерн speculative execution (⢄⠣⠌ ⠅⡠⢆⠒⢔⢄⢢⣀⠍ ⢃⠎⠚⡐⢰⡰⡰⡢⠲ ⢌⠥⠜⢅⠊⠃⡌⢈⡂⠰⡃ ⠡⡢ ⡅⠍ ⣄⡔⡘⡠⠉⠃⡆⢂⠓⠪⠩⢐⡠ ⡢⠩⢆⠱⠚⡡⢈⠦⡢⠕). Паттерн заключается в том, чтобы делать префетч данных ещё до того, как пользователь захочет что-то увидеть, чтобы в момент, когда он…
❤3
Forwarded from Machinelearning
Ошеломляющий контраст: одна NVIDIA ($4.6 трлн) сейчас стоит дороже, чем все банки США и Канады вместе ($4.2 трлн) 🫧
@ai_machinelearning_big_data
#nvidia
@ai_machinelearning_big_data
#nvidia
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3🔥3🥰1
🧩 Почему Databento не переписали feed-handler на Rust
Кратко:
- Контекст: реальный поток 14 млн сообщений/с и задержки <100 мкс. Требовались native-язык, простая параллельность и минимум общей памяти.
- Итог: для переписывания feed-handler выбрали C++23, а не Rust — из-за нескольких «больно на практике» паттернов.
Где Rust мешал именно под их кейс:
1) Повторное использование буфера
Хотели выделять буфер вне цикла и переиспользовать на итерациях без копий. Ссылки + времена жизни → конфликт с borrow-checker, хотя логически данные не переживают итерацию.
2) Самоссылочные структуры (self-referential structs)
Базовый паттерн «владение состоянием в объекте + подкомпоненты держат ссылки» в Rust упирается в модель заимствования. Обходные пути — RC/Arc или протаскивать ссылки аргументами — добавляют оверхед/шум. В C++ — просто порядок полей и правила перемещения/копирования.
3) Компиляционные дженерики
Шаблоны C++ гибче (partial specialization, fold-expr, constexpr). В Rust те же идеи требуют trait-интерфейсов и шаблонного «лесовоздства». На десятках версий структур получается много шаблонного кода или макросов.
Нет, это не «Rust плох»:
- У Databento уже много Rust в проде: кодеки DBN, realtime-шлюзы, клиентская библиотека. Инструменты cargo, диагностика компилятора и безопасность — огромный плюс.
- Но под данный «узкий» участок C++ дал:
кодо-реюз со старой базы, тонкий контроль ресурсов, гибкие шаблоны и прямая экспертиза команды.
Вывод:
- В их финтех-стеке оба языка уместны: Rust — где важны безопасность и современная экосистема, C++ — где критичны сам паттерн владения/памяти и совместимость с существующим кодом. Поле меняется: C++ получает compile-time reflection, Rust развивает Polonius — решения всегда прагматичны под задачу.
https://databento.com/blog/why-we-didnt-rewrite-our-feed-handler-in-rust
Кратко:
- Контекст: реальный поток 14 млн сообщений/с и задержки <100 мкс. Требовались native-язык, простая параллельность и минимум общей памяти.
- Итог: для переписывания feed-handler выбрали C++23, а не Rust — из-за нескольких «больно на практике» паттернов.
Где Rust мешал именно под их кейс:
1) Повторное использование буфера
Хотели выделять буфер вне цикла и переиспользовать на итерациях без копий. Ссылки + времена жизни → конфликт с borrow-checker, хотя логически данные не переживают итерацию.
2) Самоссылочные структуры (self-referential structs)
Базовый паттерн «владение состоянием в объекте + подкомпоненты держат ссылки» в Rust упирается в модель заимствования. Обходные пути — RC/Arc или протаскивать ссылки аргументами — добавляют оверхед/шум. В C++ — просто порядок полей и правила перемещения/копирования.
3) Компиляционные дженерики
Шаблоны C++ гибче (partial specialization, fold-expr, constexpr). В Rust те же идеи требуют trait-интерфейсов и шаблонного «лесовоздства». На десятках версий структур получается много шаблонного кода или макросов.
Нет, это не «Rust плох»:
- У Databento уже много Rust в проде: кодеки DBN, realtime-шлюзы, клиентская библиотека. Инструменты cargo, диагностика компилятора и безопасность — огромный плюс.
- Но под данный «узкий» участок C++ дал:
кодо-реюз со старой базы, тонкий контроль ресурсов, гибкие шаблоны и прямая экспертиза команды.
Вывод:
- В их финтех-стеке оба языка уместны: Rust — где важны безопасность и современная экосистема, C++ — где критичны сам паттерн владения/памяти и совместимость с существующим кодом. Поле меняется: C++ получает compile-time reflection, Rust развивает Polonius — решения всегда прагматичны под задачу.
https://databento.com/blog/why-we-didnt-rewrite-our-feed-handler-in-rust
❤3