← На главную

От 1 такта до 745 млн: задержки данных

13.06.2026 04:37 · hackernews

Чем дальше идёт электрический сигнал, тем медленнее доступ — это основное правило, которое пронизывает всю архитектуру современных процессоров. Причина не в скорости света (сигнал проходит 0.5 мм туда и обратно за пикосекунды), а в паразитных ёмкостях, которые растут пропорционально длине соединения.

Внутри CPU core регистры общаются с ALU или SIMD-блоками. Простые операции вроде сложения занимают один такт, умножение — 3-6, деление — до 20 (за последние годы время серьёзно сократилось). Современные CPU суперскалярные: в них несколько ALU и SIMD-блоков, поэтому за один такт может завершиться больше одной операции. Статистически это даёт до 10-12 Retired Instructions Per Cycle (RIPC), но на практике достичь даже четырёх — задача для алгоритмов, упирающихся в ALU, а не в память.

Если данных нет в регистрах, CPU идёт в кэш. L1D — около 3 тактов, L2 — 10-15, L3 — 30-70. Основная оперативная память — 200-300 тактов. Чтение с NVMe SSD — уже 30-45 тысяч тактов, с SATA — до 300 тысяч, с HDD — до 45 миллионов. Полностью синхронная запись fsync() на батарейном RAID-контроллере занимает 120 тысяч тактов, на consumer-grade SATA — уже до 30 миллионов.

Отдельная история — TLB (Translation Lookaside Buffer). Это кэш трансляции виртуальных адресов в физические. В прикладных приложениях на C++ с линейными структурами (векторы) TLB-промахи обычно не проблема. Исключения — программы с огромным потреблением RAM (базы данных, JVM) и виртуализированные среды. В таких случаях помогают huge pages.

Ветвления — главный источник головной боли. Если CPU не угадывает направление перехода, цена ошибки — 15-25 тактов. Аппаратные динамические предсказатели собирают статистику и почти всегда работают лучше разработчика. Поэтому атрибуты [[likely]] и [[unlikely]] стоит применять только если уверен на 200% — например, для обработки ошибок или редких edge-случаев внутри sin(x).

Стек почти всегда закэширован, статические переменные кэшируются неплохо, а вот данные на куче по умолчанию считаются некэшированными — если только не происходит линейный проход по вектору или полям недавно прочитанной структуры.

Выход за пределы компьютера замедляет всё ещё сильнее. LAN — 100-500 тысяч тактов, Wi-Fi — 3-30 миллионов, DSL до провайдера — 60-150 миллионов. Сигнал из Торонто в Монреаль (500 км) туда-обратно — 24 миллиона тактов (8 мс), до Дублина — 255 миллионов (85 мс), до Перта (половина земного шара) — 745 миллионов тактов (250 мс). Это лучшие оценки. На практике всё может уйти в бесконечность — пользователь просто сдаётся.

Читать оригинал →