2017-02-23 76 views
2

Когда я измеряю время работы моей программы Go с time утилитами Linux, я получаю следующий результат:Go профайлер (pprof) время Расхождение

real 1m9.177s 
user 7m1.788s 
sys  0m39.016s 

Когда я смотрю на выходе точно такого же выполнение программы в pprof профилировщика CPU Go, я получаю следующий результат:

Entering interactive mode (type "help" for commands) 
(pprof) top 
143.32s of 176s total (81.43%) 

Где pprof получать этот 176s понять из? Это не время так и процессорное время. Я запускаю эту программу с GOMAXPROCS, установленным в 8, и у меня такое чувство, что это имеет к этому какое-то отношение. Как точно измеряет время выполнения pprof и почему оно отличается от от linux?

ответ

3

Утилита time и инструмент pprof работают по-разному и должны использоваться по-разному. Не пытайтесь примирить их. time измеряет вблизи точное время для программы; pprof измеряет относительные времена для функций и методов. pprof - это интрузивный статистический образец. Когда функция профилирования CPU включена, программа Go останавливается примерно 100 раз в секунду и записывает образец, состоящий из счетчиков программ в текущем исполняемом стеке goroutine. Отбор проб имеет себестоимость, а результаты - это оценки фактического населения.

Используйте time для измерения общего фактического времени процессора для программы, то есть абсолютного времени. Используйте pprof, чтобы оценить, где большую часть времени было потрачено на функции и методы с использованием относительных временных процентов. pprof определяет узкие места. Для реального времени процессора используйте Go testing.

Для примера см Profiling Go Programs:

С помощью средства профилирования Go для идентификации и исправления конкретных узких мест, мы можем сделать программу находки цикла Go запустить порядок порядка быстрее и использовать ую меньше памяти ,

0

Это похоже на ошибку. Возможно, известная ошибка. Что делает pprof для вывода 176s, умножает известный период выборки на количество выборок. И он должен быть достаточно точным w.r.t. общее время процессора, затраченное на процесс (система + пользователь).

Есть ли вероятность, что ваша программа запускает некоторую работу через подпроцессы? Это может быть одним из способов объяснить разницу.