Какая иерархия компьютерной памяти существует
Что проверяют
Знаете ли вы порядки задержек и понимаете ли, почему одинаковый по сложности код на Go может различаться по скорости в разы. Следом обычно просят пример: что в Go-коде бьёт по кэшу и как это измерить.
Как отвечать
Назовите уровни с порядками величин, точные цифры зависят от процессора:
- регистры: доступ за такт, их десятки;
- L1: десятки килобайт на ядро, около 1 нс;
- L2: от сотен килобайт до пары мегабайт на ядро, единицы наносекунд;
- L3: общий для ядер, десятки мегабайт, от 10 до 40 нс;
- оперативная память: гигабайты, около 100 нс;
- накопители и сеть: NVMe SSD десятки микросекунд, HDD миллисекунды.
Между уровнями данные ходят кэш-линиями, обычно по 64 байта (на Apple Silicon 128). Поэтому важна локальность: процессор подгружает соседние данные и предсказывает последовательный доступ. Ещё одну цену добавляет виртуальная память: адрес переводит TLB, и промах по нему тоже стоит времени.
Затем привяжите к Go:
- слайс структур против слайса указателей:
[]Pointлежит подряд,[]*Pointраскидан по куче, обход второго бьёт по кэшу и нагружает сборщик мусора; - false sharing: счётчики разных горутин в одной кэш-линии заставляют ядра постоянно отбирать её друг у друга. Лечится выравниванием полей до 64 байт или шардированием;
- escape analysis:
go build -gcflags=-mпокажет, что уехало в кучу. Значения на стеке дешевле и не нагружают GC; - порядок полей в структуре: из-за выравнивания
bool, int64, boolзанимает 24 байта, аint64, bool, bool16.
Измеряют это бенчмарками go test -bench с -benchmem, через pprof, а на Linux через perf stat для промахов кэша.
Где спотыкаются
Перечисляют уровни без цифр. Главная мысль ответа в том, что между L1 и RAM разница около ста раз, а между RAM и диском ещё несколько порядков.
Считают, что в языке со сборщиком мусора раскладка данных не важна. Именно в Go переход от указателей к значениям часто даёт больше, чем смена алгоритма.
Путают кэш процессора с кэшем приложения вроде Redis или словаря в памяти. Это разные уровни абстракции, а интервьюер спрашивает про железо.