На разных курсах подробно разбирают, как писать код, какие математические модели стоят за алгоритмами и как программа превращается в машинные инструкции. Но код выполняется не в абстракции: на его поведение влияют процессор, иерархия памяти, накопители, сеть, энергопотребление и охлаждение.
Поэтому программисту полезно уметь отвечать на практические вопросы. Почему два варианта одного алгоритма отличаются по скорости в разы? Почему последовательный доступ обычно быстрее случайного? Когда HDD рациональнее SSD? Почему перемещение данных иногда обходится дороже самих вычислений? И как заранее оценить задержку, а затем проверить оценку измерениями?
Часть этих тем встретится вам на АКОС или появятся на курсах специализации «Распределённые системы». Сегодня мы соберём их в единую инженерную картину.
Разработка вычислительных систем — одна из самых сложных и наукоёмких инженерных областей. Даже обычный ноутбук или сервер объединяет результаты работы множества команд. В упрощённом виде нам понадобятся следующие компоненты:
Это не набор независимых деталей: итоговая скорость определяется их взаимодействием и узким местом конкретной нагрузки. Поэтому прежде чем обсуждать отдельные компоненты, введём две базовые характеристики производительности.
При разговоре о производительности почти всегда нужно различать две характеристики.
Latency, или задержка, — время выполнения одной операции или прохождения одного запроса. Её измеряют, например, в наносекундах, микросекундах или миллисекундах.
Корректные вопросы: