Урок №137. Вимірювання часу виконання (таймінг) коду

  Юрій  | 

  Оновл. 24 Вер 2021  | 

 164

Іноді, в процесі написання коду, ви можете зіткнутися з ситуаціями, коли не будете певні, яка з двох функцій виявиться ефективнішою (припускається, що кінцевий результат у обох функцій однаковий). Як це визначити?

Один з найпростіших способів — засікти час виконання кожного з фрагментів коду. У C++11 це робиться через бібліотеку chrono. Ми можемо легко інкапсулювати весь необхідний нам функціонал в клас, який потім будемо використовувати в наших власних програмах.

Ось клас:

Для його використання потрібно визначити об’єкт класу Timer у верхній частині функції main() (або звідки ви хочете починати відлік), а потім просто викликати метод elapsed() після частини коду, яку ви перевіряєте:

Розглянемо реальний приклад, де потрібно впорядкувати масив з 10 000 елементів. Скористаємося алгоритмом сортування методом вибору:

На комп’ютері автора результат 3 прогонів коду становить 0.0508, 0.0507 і 0.0499 секунди, тобто близько 0.05 секунди.

Тепер виконаємо те ж саме, але вже з std::sort зі Стандартної бібліотеки C++:

Результати 3 прогонів на комп’ютері автора складають 0.000694, 0.000693 і 0.000697 секунди, тобто близько 0.0007 секунди.

Таким чином, алгоритм std::sort() в 75 разів швидший за сортування, яке ми написали самі!

Що впливає на таймінг коду?

Таймінг коду є досить простим і прозорим, але ваші результати можуть істотно відрізнятися.

По-перше, переконайтеся, що ви використовуєте режим конфігурації “Release”, а не “Debug”. Під час режиму “Debug” оптимізація зазвичай відключена, а вона може мати значний вплив на результати. Наприклад, в конфігурації “Debug” виконання сортування елементів масиву через std::sort() на комп’ютері автора зайняло 0.0237 секунди, що в 34 рази більше, ніж в конфігурації “Release”!

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

Виконуйте таймінг як мінімум 3 рази. Якщо результати однакові — вибирайте середнє. Якщо один або два результати значно відрізняються один від одного, то запустіть таймінг ще кілька разів, поки не отримаєте краще уявлення про те, які з результатів виявилися «лівими». Зверніть увагу, деякі, здавалося б, невинні речі, такі як веб-браузери, можуть тимчасово збільшити навантаження на ваш процесор до 100%, коли сайт, на якому ви перебуваєте в фоновому режимі, виконує цілу купу JavaScript-скриптів (рекламні банери, запуск відео, складна анімація тощо). Запуск таймінгу кілька разів дозволить визначити, чи вплинула подібна подія на ваші результати.

По-третє, при порівнянні двох фрагментів коду намагайтеся не запускати нічого зайвого в фоновому режимі при прогонах коду, так як це також може вплинути на результати таймінгу. Можливо, ваш антивірус почав сканування у фоновому режимі, або ви вирішили послухати музику на стрімінговому сервісі (і це все в перервах між прогонами).

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

Нарешті, ваші результати дійсні тільки для архітектури вашого комп’ютера, ОС, компілятора і системних/технічних характеристик. Ви можете отримати зовсім інші результати на інших системах, які мають інші сильні і слабкі сторони.

Оцінити статтю:

1 Зірка2 Зірки3 Зірки4 Зірки5 Зірок (7 оцінок, середня: 5,00 з 5)
Loading...

Залишити відповідь

Ваш E-mail не буде опублікований. Обов'язкові поля відмічені *