Хот-спот (программирование)

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску

Хот-спот (англ. hotspot[1]) — участок кода в программе, на который приходится бо́льшая часть исполняемых инструкций процессора[2] или на исполнение которого процессор затрачивает очень много времени[3] (одни инструкции исполняются быстрее, а другие — медленнее). Хот-споты могут являться узкими местами программы, если на них приходится лишняя нагрузка из-за неэффективности кода, — в таком случае они могут быть подвергнуты оптимизации[3].

Излишне ресурсоёмкие участки кода[править | править код]

Излишне ресурсоёмкие участки кода («узкие места» программы) могут быть следствием выбора более медленного алгоритма решения задачи, не до конца продуманной архитектуры приложения, особенностей работы микропроцессора, следствием ожидания операций ввода-вывода и т.п.

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

Выявление ресурсоёмких участков[править | править код]

Выявление и анализ «горячих точек» программы может указать направления для её дальнейшей оптимизации[2].

Глубокий анализ может быть произведён отдельно для различных архитектур процессора и может включать в себя анализ нагрузки на различные уровни кэша процессора, анализ шаблонов доступа к памяти, изучение счётчика утилизации циклов процессора и т.п.[2]

Для выявления ресурсоёмких участков в программе используются специальные программы, называемые профилировщиками (профайлерами).

Самыми известными профайлерами в операционных системах семейства Unix являются gprof[en] и Callgrind. В Linux дополнительно доступны OProfile и perf. Во многих развитых интегрированных средах разработки имеются встроенные профилировщики, например, в Microsoft Visual Studio, NetBeans и т.п.

Существует два основных способа профилирования: через анализ времени исполнения кода (Callgrind) и через счётчики производительности процессора (OProfile). Первый способ позволяет находить код, который долго исполняется по времени (например, длительная блокировка по семафору). Второй способ позволяет находить участки кода, которые более остальных нагружают процессор (например, ресурсоёмкие вычисления). Используя оба метода можно анализировать участки кода для понимания причин, по которым они слишком долго исполняются. Если функция исполняется долго, но по счётчикам производительности процессора почти не нагружает процессор, — в ней может происходить длительная блокировка, либо длительный системный вызов к ядру операционной системы.

См. также[править | править код]

Примечания[править | править код]

  1. Evaluate performance for Linux on POWER (англ.). www.ibm.com (12 June 2012). Дата обращения 23 января 2016.
  2. 1 2 3 Измерение производительности Linux на компьютерах POWER. www.ibm.com (17 января 2013). Дата обращения 6 января 2016.
  3. 1 2 Планирование параллельной оптимизации | Intel® Developer Zone. software.intel.com. Дата обращения 6 января 2016.

Ссылки[править | править код]