getrusage против clock_gettime()
Я пытаюсь получить процессорное время, потребляемое процессом в Ubuntu. Насколько я знаю, есть две функции, которые могут выполнять эту работу: getrusage() и clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &tp). В моем коде вызов getrusage () сразу после clock_gettime (CLOCK_PROCESS_CPUTIME_ID, & tp) всегда дает разные результаты.
Может ли кто-нибудь помочь мне понять, какая функция дает более высокое разрешение и какие преимущества / недостатки у этих функций?
Благодарю.
1 ответ
getrusage(...)
- Разделяет процессорное время на системные и пользовательские компоненты в ru_utime и ru_stime соответственно.
- Примерно микросекундное разрешение: struct timeval имеет поле tv_usec, но это разрешение обычно ограничено примерно 4 мс /250 Гц (источник)
- Доступно в SVr4, 4.3BSD, POSIX.1-2001: это означает, что оно доступно как в Linux, так и в OS X
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, ...)
- Объединенное общее системное и пользовательское время без возможности разделения на системное / пользовательское время.
- Разрешение наносекунд: struct timespec является клоном struct timeval, но с tv_nsec вместо tv_usec. Точное разрешение зависит от того, как таймер реализован в данной системе, и может быть запрошено с помощью clock_getres.
- Требуется ссылка на librt
- Часы могут быть недоступны. В этом случае clock_gettime вернет -1 и установит errno в EINVAL, так что это хорошая идея, чтобы обеспечить откат getrusage. (источник)
- Доступно в SUSv2 и POSIX.1-2001: это означает, что оно доступно в Linux, но не в OS X.