РЕЦЕНЗИИ

Касперски К. Техника оптимизации программ. Эффективное использование памяти. СПб: БХВ-Петербург, 2003. - 464 с.

Стремительный рост производительности процессоров и объемов памяти с одновременным и не менее быстрым уменьшением их стоимости, которые мы наблюдали на протяжении примерно четверти века, породили у многих разработчиков ощущение, что заботиться об эффективности своих программ нет никакой нужды: мощные процессоры "переварят" что угодно, ну а если программа уж слишком большая, всегда можно добавить очередной гигабайт ОЗУ. До определенной степени это верно, но встречаются задачи, способные "сожрать" любой объем памяти и неограниченное процессорное время. Например, рендеринг пятиминутного мультфильма может потребовать нескольких суток непрерывной работы мощнейшей многопроцессорной рабочей станции. Есть ли альтернативы "механическому" увеличению производительности аппаратуры? Автор рассматриваемой книги убедительно показывает, что есть, и это - оптимизация программ.

Во введении к рецензируемому изданию читатель знакомится со смыслом и фундаментальными принципами оптимизации, а также с несколькими наиболее распространенными заблуждениями в этой части.

Вся первая глава посвящена профилировке программ. Казалось бы, это достаточно рутинная операция, но ведь без нее практически невозможно определить, кто же "виноват" в медленной работе программы. Вместе с тем штатные профилировщики компиляторов часто оказываются бесполезны. Автор дает теоретические сведения о профилировке и связанных с ней проблемах и демонстрирует на практике использование мощнейшего инструмента этого класса - Intel VTune, не обходя, впрочем, вниманием и другие средства. "Подопытным кроликом" служит здесь небольшая тестовая программка - пародия на переборщик паролей, в результате глубокой оптимизации которой скорость ее работы возрастает с 30 тыс. до 84 млн. паролей в секунду, т. е. почти в 3000 раз!

Во второй главе автор знакомит читателя с оперативной памятью и связанными с нею проблемами. Сначала рассматриваются принципы функционирования ОЗУ, выполненного по разным технологиям - от старой Conventional DRAM до DDR SDRAM и Rambus RDRAM. После этого анализируются методы оптимизации работы с памятью, понимание которых невозможно без знакомства с принципами функционирования не виртуальных, а вполне реальных микросхем ОЗУ. Значительное внимание уделяется разбору штатных функций работы со строками входящих в состав библиотек компиляторов Cи, а также в Win32 API, причем выводы оказываются весьма неутешительными.

Кэш-память теоретически незаметна для прикладного программиста, да и системщики зачастую могут игнорировать ее существование, однако ее влияние на производительность трудно переоценить, поэтому третью главу автор посвятил именно ей. Как и в случае с ОЗУ, сначала разбираются принципы функционирования отдельных ячеек статической памяти, на базе которых строится кэш, а затем анализируется подсистема кэш-памяти в целом. После этого описываются важнейшие методы оптимизации и возникающие при этом проблемы. Значительное внимание уделено описанию различий процессоров производства Intel и AMD: будучи программно совместимыми, но очень различаясь по внутреннему устройству, они предъявляют разные требования к оптимизации программ, и игнорирование этих различий может привести к многократной потере скорости. Наконец, рассматривается управление кэшированием, обеспечиваемое всеми последними поколениями процессоров семейства x86.

Последняя глава посвящена машинной оптимизации. Изучаются методы, применяемые в оптимизирующих компиляторах Cи/C++, и их влияние на эффективность программы. Глава заканчивается обсуждением достоинств и недостатков программирования на ассемблере по сравнению с использованием языков высокого уровня.

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

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

Версия для печати