Комментарии (34)
- Структура Strip занимает 8 байт, но автор утверждает, что 259×64+7296 ≈ 24 КБ, что вызывает сомнения в правильности подсчёта памяти.
- Участники обсуждения предполагают, что речь идёт о кэш-линии в 64 байта и false-sharing, а не о фактическом размере структуры.
- Появился вопрос о том, какие именно бенчмарки корректности используются, и как можно было бы проверить корректность рендеров.
- Также обсуждалось, что вывод рендерера является растровое изображение, что требует копирования на GPU, что может быть не нужно на UMA-системах.
CPU cache-friendly data structures in Go
Статья разбирает, как структуры данных влияют на производительность Go-программ под современными CPU. Автор подчеркивает, что чтение из оперативной памяти в 60 раз медленнее, чем из кэша L1, и что ложный обмен (false sharing) между ядрами может убить производительность. Показано, как добавление 56-байтовой прокладки между полями структуры устраняет проблему и ускоряет код в 6-10 раз. Другой совет — разделять «горячие» и «холодные» данные и использовать структуры, оптимизированные под кэш-линии. Показано, как профилировать кэш-промахи через perf и как тестировать эффективность структур данных.
Комментарии (48)
- False sharing и cache-line padding в Go приводят к 10-кратному ускорению при использовании структур, разделённых на разные ядра, но требуют ручного управления выравниванием и размером кэш-линии.
- Компилятор Go не переупорядочивает поля структур и не вставляет паддинг, что делает невозможным автоматическое устранение false sharing без кода, что ограничивает оптимизации только ручными методами.
- Пользователи отмечают, что большинство описанных приёмов применимы к другим языкам и что современные компиляторы должны бы справляться с большинством этих проблем автоматически, но в то же время признают, что для низкоуровневой оптимизации лучше подойдут другие языки и инструменты.