Структуры данных на практике. Глава 4: Массивы и локальность кэша

«Массив — самая важная структура данных в computer science», — Дональд Кнут (вольное изложение цитаты)
Простейшая структура данных
Массивы настолько просты, что мы иногда воспринимаем их, как нечто само собой разумеющееся. Смежная память, доступ за O(1): что тут ещё оптимизировать?
Всё.
Я работал над конвейером обработки пакетов сетевого коммутатора. Код был простым: считываем пакеты из кольцевого буфера (массива), обрабатываем их и записываем результаты в другой массив. Всё просто, правда?
Но производительность была ужасной. Мы обрабатывали 100 тысяч пакетов в секунду, хотя оборудование должно было справляться с 1 миллионом.
Профилировщик показал нечто странное:
$ perf stat -e cache-misses,instructions ./packet_processor
Performance counter stats:
450,000 cache-misses
1,000,000 instructions
450000 промахов кэша на 1000000 команд? То есть промах происходил раз в 2-3 команды. При простых операциях с массивами это не имело никакого смысла.
Проблема заключалась не в самих массивах, а в том, как мы их использовали.


















