Приветствуем, уважаемые читатели! На связи Олег Сивченко @OlegSivchenko.

Пару месяцев назад мы анонсировали выход русскоязычного издания знаменитой в узких кругах книги Дениса Бахвалова, которая в оригинале называется «Performance Analysis and Tuning on Modern CPUs» или просто «perf-book». Теперь она, наконец, в продаже и на полках магазинов. Русское издание называется «Оптимизация производительности современных процессоров. 2-е изд.». Это один из моих наиболее сложных, выстраданных, многоэтапных и при этом ценных проектов за последние четыре года. Уверен, он бы не состоялся без активного участия автора, его искренней заинтересованности и содействия в редактуре, проверке терминологии и в целом качества перевода, а также при составлении глоссария.

Мы впервые списались с уважаемым Денисом Бахваловым ещё в феврале 2023 года, когда существовало лишь первое издание книги, выложенное здесь. Денис — автор замечательного блога об анализе и оптимизации производительности процессоров (прежде всего, на материале архитектуры Intel). На момент подготовки книги Денис являлся сотрудником компании Intel, поэтому все изложенные в книге приёмы и эксперименты — это часть его рабочей практики. Денис сразу заинтересовался перспективой перевода книги на русский язык, но оговорился, что собирается готовить второе издание. В итоге мы вернулись к разговору только в сентябре 2023 года. Затем Денис подготовил китайское издание книги, а уже в марте 2024 года приступил к тестированию примеров для будущего второго издания на новом оборудовании. Таким образом, второе издание отражает состояние архитектуры процессора (примеры тестировались на Intel) на середину 2024 года. Денис настолько подробно охарактеризовал суть книги, её отличия от первого издания, учтённые ошибки и связь с другими своими образовательными проектами, что я просто приведу здесь отрывок из введения (следующие два раздела статьи - от автора).

О книге

Эту книгу я начинал писать с простой целью: научить разработчиков программного обеспечения глубже понимать особенности производительности своих приложений. Я знаю, насколько сложной для новичка или даже для опытного разработчика может быть тема обеспечения эффективности на низком уровне. И я помню те дни, когда начинал заниматься таким анализом. Я смотрел на незнакомые метрики, пытаясь сопоставить данные, которые не совпадали, и был озадачен. Прошли годы, пока наконец не «щелкнуло» и все кусочки головоломки не сложились... хотя иногда я все еще преодолеваю эти же проблемы.

В то время как я делал свои первые шаги в инженерии производительности, единственными надежными источниками информации по этой теме были руководства для разработчиков программного обеспечения, а это не совсем то, что любят читать обычные разработчики. Честно говоря, жаль, что, когда я пытался разобраться с низкоуровневым анализом эффективности и быстродействия, у меня не было такой книги <как эта - О. С.>. В 2016 году я в своем блоге стал делиться полученными знаниями и получил несколько положительных отзывов от своих читателей. Некоторые из них предложили объединить эту информацию в книгу. И эта книга — их заслуга.

Многие спрашивали, как пришло решение заняться изданием книги самостоятельно. На самом деле я сначала пытался представить ее нескольким солидным издательствам, но они не увидели от издания такой книги финансовой выгоды. Однако мне очень хотелось ее написать, поэтому я все равно решил это сделать. В итоге получилось достаточно хорошо, и я рискнул самостоятельно опубликовать и второе издание.

Первое издание вышло в ноябре 2020 года. Книгу хорошо приняло сообщество, однако читатели высказали много конструктивной критики. Самым популярным пожеланием было включить в книгу упражнения для экспериментов. Некоторые жаловались, что книга слишком сфокусирована на процессорах Intel и не затрагивает другие архитектуры, такие как AMD и ARM. Другие читатели предложили мне рассказать об эффективности всей системы, а не только о производительности процессора.

Второе издание получило развитие не только в этих, но и во многих других направлениях. По объёму книга получилась в два раза больше первой.

Если говорить конкретно, то я хочу выделить упражнения, которые я добавил во второе издание книги. Я создал дополнительный онлайн-курс «Performance Ninja» с более чем двадцатью лабораторными заданиями. Я рекомендую вам использовать эти небольшие головоломки для отработки методов оптимизации и проверки степени усвоения материла. Я считаю это лучшей частью, которая отличает данную книгу от других. Надеюсь, моя книга сделает ваш процесс обучения более увлекательным. Более подробную информацию об онлайн-курсе можно найти в разделе 1.7.

Я не понаслышке знаю, что низкоуровневая оптимизация производительности — дело непростое. Поэтому постарался объяснить все как можно понятнее, но тема очень сложная. Для полного понимания материала требуются эксперименты и практика. Рекомендую вам не торопиться, последовательно прочитать все главы и поэкспериментировать с примерами, представленными в онлайн-курсе.

За свою карьеру я никогда не избегал задач по оптимизации программного обеспечения. Всякий раз, когда мне удавалось заставить свою программу работать быстрее, я получал дофаминовый удар. Воодушевление оттого, что я открыл что-то новое и почувствовал удовлетворение, делало меня еще более любопытным и жаждущим большего. Поначалу моя работа была очень бессистемной. Теперь я профессионал, но по-прежнему чувствую себя очень счастливым, когда заставляю программу работать быстрее. Надеюсь, вы тоже испытаете радость от обнаружения проблем с эффективностью и удовлетворение от их устранения.

Искренне надеюсь, что данная книга поможет вам освоить низкоуровневый анализ производительности. Если в результате у вас получится ускорить работу вашего приложения, я буду считать свою миссию выполненной.

Целевая аудитория

Если вы работаете с приложениями, для которых важна производительность, эта книга для вас. В первую очередь она адресована разработчикам программного обеспечения для высокопроизводительных вычислений, искусственного интеллекта, разработки игр, приложений для центров обработки данных (таких как Google и т. д.), высокочастотного трейдинга и других отраслей, где значение оптимизации производительности хорошо известно и оценено.

Кроме того, эта книга будет полезна любому разработчику, который хочет лучше понимать особенности работы своего приложения, связанные с эффективностью и быстродействием, и знать, как эти показатели можно улучшить. Возможно, вы просто увлечены технологией повышения производительности и хотите узнать об этом больше. Или же вам хочется стать самым умным инженером в комнате — это тоже нормально. Я надеюсь, что материал, представленный в этой книге, поможет вам развить новые навыки, которые вы сможете применить в повседневной работе и, возможно, способствовать развитию своей карьеры.

Кратко о содержании книги

Книга Дениса Бахвалова содержит как базовый, так и очень продвинутый материал, поскольку в деле оптимизации каждый читатель сам решает, достигнут ли искомый результат, и пришло ли время остановиться. Многие справочные темы автор вынес в три приложения, занимающие около 30 страниц.

Поскольку читателям наверняка известно, что преждевременная оптимизация — корень всех зол, перед тем, как приступать к оптимизации, нужно изучить, что мы должны оптимизировать в первую очередь, какова иерархия низкоуровневых слоёв компьютера, а также всё тщательно измерить. Глава 2 посвящена аппаратной оптимизации процессора и рассматривает такие фундаментальные вопросы, как программные и аппаратные таймеры и микробенчмарки. Глава 3 мне кажется ещё более важной, так как в ней автор подробно разбирает микроархитектуру процессора, в том числе, параллелизм на уровне инструкций (ILP), одиночный поток команд, множественный поток данных, ОКМД/SIMD, буфер ассоциативной трансляции (TLB). Также разобрано, как устроен кеш, и что входит в состав фронтенда и бэкенда процессора.

В главах 5 и 6 рассматриваются средства инструментации процессора, и именно глава 6 является одним из самых ценных фрагментов второго издания — автор рассматривает многие темы, сравнивая, как они реализованы в архитектурах Intel, ARM и AMD.

Весь этот материал можно считать подготовительным для изучения второй части книги, названной «Тюнинг исходного кода». Она, в сущности, алгоритмическая. Здесь рассматриваются доступ к памяти, промахи кеша, оптимизация вычислений, тонкости работы с компилятором (разработка компиляторов — одна из основных сфер профессиональных интересов Дениса Бахвалова). На мой взгляд, эту часть книги можно считать сокращённым изложением блога easyperf.net, и материал книги и блога было бы полезно изучать параллельно. Автор постепенно подводит читателя к самым сложным вопросам оптимизации многопоточных приложений, затрагивает работу с компилятором Clang и с eBPF механизмом внедрения пользовательского кода в ядро — кстати, ранее у нас выходила книга Лиз Райс «Изучаем eBPF: программирование ядра Linux для улучшения безопасности, сетевых функций и наблюдаемости» в переводе Олега Ивановича Цилюрика.

Заключение

Когда завершается настолько масштабный проект, сложно избавиться от чувства опустошения и вернуться к проработке такой сложной темы, как низкоуровневая оптимизация процессора. Более того, очень серьёзные хабровчане (воздержусь от упоминания имён, скажу лишь, что речь идёт о пользователях с кармой ) Убеждён, что нам удалось материал, уникальный по практической ценности и плотности изложения. По уровню практического опыта автора и умения вникать в детали могу сравнить эту книгу разве что с изданиями «Расширения ядра Linux. Драйверы и модули» Олега Цилюрика и «Экскурс в неопределённое поведение C++» Дмитрия Свиридкина и Андрея Карпова. Благодарим Дениса Бахвалова за многомесячный совместный труд над русским изданием, желаем ему неизменных профессиональных успехов, новых открытий, амбициозных проектов и многочисленных переводов этой книги на другие мировые языки, которых она в высшей степени достойна.