Профілювання (програмування)

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку
CodeAnalyst3.png

Профілювання — збір та аналіз інформації про виконання програми з метою оптимізації її роботи, застосовується в процесі розробки програмного забезпечення. Профілювання — форма аналізу динамічних показників програми, в протилежність статичному аналізу коду. Звичайна задача аналізу продуктивності — визначити частини програми, які слід оптимізувати для покращення використання пам'яті або підвищення швидкості. Профілювання виконується за допомогою спеціальних програмних засобів, що називаються профайлерами.

Використання профайлерів[ред. | ред. код]

Інструменти програмного аналізу критично важливі для розуміння поведінки програми. Комп'ютерним архітекторам потрібні такі інструменти, аби оцінити, як хороші програми виконуватимуться на новій архітектурі. Авторам програмного забезпечення також потрібні інструменти, аби проаналізувати їх програми і ідентифікувати критичні частини коду. Автори компіляторів часто використовують такі інструменти, аби з'ясувати, як добре виконується їх планування інструкцій або алгоритм передбачення, що відгалужується...

Профайлер — інструмент аналізу продуктивності, який збирає дані для профілювання, особливо кількість викликів і тривалість виконання функцій. Вихідний результат — потік записаних подій (a trace) або статистичний короткий звіт спостережуваних подій (a profile). Профайлери використовують широку різноманітність методів, аби зібрати дані, у тому числі апаратні переривання, апраратну підтримку, пастки операційної системи. Використання профайлерів потрібне в процесі планування продуктивності.

Оскільки підсумовування в профайлі пов'язано з позицією вихідного коду, розмір вихідних даних лінійно залежить від розміру коду програми та може залежати від часу її виконання. Для однопоточних програм профайл надає достатньо інформації для оптимізації, але проблеми продуктивності в багатопоточних програмах через очікуючі повідомлення або проблеми синхронізації часто залежать від взаємозв'язку часу виникнення подій, тому вимагають розширеного запису профайлу, щоб зрозуміти проблему.

Історія[ред. | ред. код]

Інструменти аналізу продуктивності існували на платформах IBM/360 і IBM/370 від початку 1970-х років. Ці інструменти зазвичай використовували переривання таймера, які записували PSW (англ. Program Status Word, Слово Стану Процесора) в визначені проміжки часу, аби виявити "гарячі місця" у виконуваному коді. В 1974 році Імітатори Системи Команд надали повний запис і інші можливості контролю продуктивності.

Виконуваний профайлером аналіз програми на Unix датується як мінімум 1979 роком, коли для систем Unix було розроблено основний інструмент prof, який виводив список викликів кожної функції і тривалість її виконання. У 1982 році gprof розширив профілювання до повного аналізу графа виклику.

У 1994 році Амітаб Срівастава і Алан Юстас з Digital Equipment Corporation видали документ, що описує АТОМ. АТОМ — платформа для перетворення програми на її власний профайлер. Тобто, під час компіляції, вона вставляє в програму спеціальний код для збирання інформації про події в програмі. Ця техніка, що змінює програму для аналізу, відома як "instrumentation".

Типи профайлерів, основаних на виводі[ред. | ред. код]

Flat профайлер[ред. | ред. код]

Flat-профайлери обчислюють середній час виклику функцій і не переривають виклики, засновані на callee або контексті.

Call-Graph профайлер[ред. | ред. код]

Call Graph профайлери показують часи виклику і частоти функцій, а також ланцюги викликів, заснованих на callee. Проте не зберігають контекст.

Методи збору даних[ред. | ред. код]

Профайлери, засновані на подіях[ред. | ред. код]

Мови програмування, перелічені тут, мають профайлери, засновані на подіях:

  • .NET: Може прикріпити профілюючого агента як сервер COM до CLR. Подібно до Java, час виконання потім забезпечує різні повторні виклики в агентові, для перехоплення подій подібно до методу JIT/ введення / вихід, створення об'єктів і т.п. Особливо потужний в цьому агент профілювання може переписати код цільової програми довільним способом.
  • Java: JVM-Tools Interface (колись JVM Profiling Interface) JVM API забезпечує пастки до профайлеру, для заманювання в пастку подій, таких як викликів, завантаження класу, вивантаження, вхід-вихід потоку.
  • Python: профілювання Python включає модуль профілювання, хотшот (який є заснованим на call-graph), і використовуючи 'Sys.setprofile()' модуль до подій-пасток подібно до c_{call,return,exception}, python_{call,return,exception}.
  • Ruby: Ruby також використовує подібний до Python інтерфейс для профілювання. Є flat-профайлер в profile.rb, модуль, і ruby-prof C-розширення.

Статистичні профайлери[ред. | ред. код]

Деякі профайлери оперують здійсненням вибірки. Профайлер, що здійснює вибірку, досліджує лічильник команд цільової програми з регулярними проміжками, використовуючи переривання операційної системи. Профайлери, що здійснюють вибірку, зазвичай менш точні і специфічні, але дозволяють цільовій програмі працювати майже на повну швидкість.

Деякі профайлери надають цільовій програмі додаткові команди збирати необхідну інформацію. Це може призводити до змін у виконанні програми, викликаючи неакуратні результати і помилки. Це може бути дуже специфічним, але уповільнює цільову програму, оскільки більше специфічної інформації збирається.

Результуючі дані не остаточна істина, а статистична апроксимація. Фактична кількість помилок зазвичай більша, ніж один вибраний період вибірки. Фактично, якщо значення - n разів періоду вибірки, очікувана помилка в ньому - корінь квадратний з вибраних періодів.

Деякі з найбільш використовуваних статистичних профайлерів це GNU's gprof, Oprofile, AMD's CodeAnalyst та SGI's Pixie.

Інструменти[ред. | ред. код]

Інструкція: Робиться програмістом, наприклад додаючи команди, аби явно обчислити часи виконання.

Допоміжний компілятор: Приклад: "gcc -pg ..." для gprof, "quantify g++ ..." для Quantify Бінарна трансляція: інструмент додає інструментацію в скомпільований бінарник. Приклад: АТОМ.

Інструментація виконання: Безпосередньо перед виконанням код інструментується. Програмна дія повністю контролюється і управляється інструментом. Приклади: PIN, Valgrind.

Ін'єкція виконання: Легше, ніж інструментація виконання. Код змінюється в часі виконання, аби мати переходи до допоміжних функцій. Приклад: DynInst.

Гіпервайзер: Дані збираються виконанням (зазвичай) незміненої програми під управлінням гіпервайзера. Приклад: SIMMON.

Симулятор: Дані збираються виконанням під управлінням Симулятора Системи Команд. Приклади: SIMMON, SIMON і OLIVER.

Див. також[ред. | ред. код]