Розуміння time.perf_counter () та time.process_time ()


76

У мене є запитання щодо нових функцій time.perf_counter()та time.process_time().

Для перших, з документації:

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

Чи однакова ця "найвища роздільна здатність" у всіх системах? Або це завжди трохи залежить, якщо ми, наприклад, використовуємо Linux або Windows?
Питання випливає з того факту, що, читаючи документацію до time.time()нього, сказано, що "не всі системи забезпечують час з кращою точністю, ніж 1 секунда". Тож як вони можуть забезпечити кращу і вищу роздільну здатність зараз?

Про останнє time.process_time():

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

Я не розумію, що це за "системний час" і "час процесора користувача"? Яка різниця?


Це більше duckвикористовувати час за функцією, а не за реалізацією. Тобто, використовуйте time.time()або time.monotonic()залежно від того, що ви хочете.
Діма Тиснек

3
Дивіться цей коментар про те , як все ядра , використовувані в процесі підсумовуються в time.clockі time.process_time, але дочірні процеси не є. Також дивіться це обговорення точності (звичайно, залежить від системи).
максимум

Відповіді:


100

У цьому контексті існують два різних типи „часу”: абсолютний час та відносний час.

Абсолютний час - це "реальний час", який повертається time.time()і з яким ми всі звикли мати справу. Зазвичай його вимірюють з фіксованого моменту часу в минулому (наприклад, епоха UNIX з 00:00:00 UTC 01.01.1970) з роздільною здатністю не менше 1 секунди. Сучасні системи, як правило, забезпечують роздільну здатність у мілі або мікросекунди. Він підтримується спеціальним обладнанням на більшості комп’ютерів, схема RTC (годинник реального часу), як правило, працює від батареї, тому система відстежує реальний час між включеннями. Цей `` реальний час '' також може змінюватися залежно від вашого місцезнаходження (часові пояси) та сезону (перехід на літній час) або виражається як зсув від UTC (також відомий як GMT або зулуський час).

По-друге, існує відносний час, який повертається time.perf_counterі time.process_time. Цей тип часу не має чіткого відношення до реального часу, в тому сенсі, що відносини є специфічними для системи та реалізації. Він може використовуватися лише для вимірювання інтервалів часу, тобто одиничної величини, яка пропорційна часу, що минув між двома моментами. Це в основному використовується для оцінки відносної продуктивності (наприклад, чи працює ця версія коду швидше, ніж ця версія коду).

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

time.perf_counterповертає абсолютне значення лічильника. time.process_time- це значення, яке походить від лічильника процесора, але оновлюється лише тоді, коли даний процес працює на центральному процесорі і може бути розбито на "час користувача", тобто час, коли сам процес працює на центральному процесорі, і "система час ', тобто час, коли ядро ​​операційної системи працює на ЦП від імені процесу.


Отже, в сучасних комп’ютерах -> два годинники (тобто дві самостійні схеми), один просто керує в режимі реального часу, інший - роботою центрального процесора, так? чому цей поділ? Я маю на увазі, чи не може бути лише один годинник, використовуючи припущення, наприклад, 100 звернень апаратного годинника = 1 секунда?
zer0uno

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

Я не говорю про обмеження, я кажу, щоб вивести реальний час з лічильника центрального процесора, я маю на увазі, якщо у мене процесор 2 ГГц, кожен раз, коли робиться 2 мільйони коливань, я збільшую час секунди
zer0uno

3
як би ОС знала про частоту процесора? про стан з низьким енергоспоживанням процесора? кому вірити в багатоядерні системи? А що відбувається, коли центральний процесор вимкнений? Управління настільки складною справою, коли виділити виділений акумулятор у режимі реального часу так легко.
isedev

@antox: для кращого розуміння прочитайте це
jfs
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.