Это отвечает прекрасные детали о значении реальных, пользовательских и системных таймингов.Процитируем:
«Реальное» - это время настенных часов - время от начала до конца разговора.Это все прошедшее время, включая временные интервалы, используемые другими процессами, и время, которое процесс блокирует (например, если он ожидает завершения ввода-вывода).
«Пользователь» - этоколичество процессорного времени, потраченного в коде пользовательского режима (вне ядра) внутри процесса.Это только фактическое время процессора, используемое при выполнении процесса.Другие процессы и время, которое процесс заблокировал, не учитываются в этом значении.
'Sys' - это количество процессорного времени, проведенного в ядре внутри процесса.Это означает выполнение процессорного времени, затраченного на системные вызовы в ядре, в отличие от библиотечного кода, который все еще выполняется в пользовательском пространстве.Как и «пользователь», это только процессорное время, используемое процессом.
Из приведенного выше объяснения видно, что время Пользователь + Sys должно быть равно секундам процессора.Вместо этого ближе к «реальному» времени.Странный!
Этому есть справедливое объяснение.Время пользователя не включает в себя секунды ЦП, затраченные на операции ввода-вывода в процессе.Он просто измеряет время процессора, потраченное на код пользовательского режима в памяти .Основное правило:
реальное время = пользователь + sys + время ввода-вывода + время запуска интерпретатора + время компиляции байт-кода
Чтобы проверить это, я сделал urllib2.urlopen(urllib2.Request(url))
вызов с интенсивным вводом / выводом.Вот результаты:
100792 function calls (98867 primitive calls) in 2.076 CPU seconds
Ordered by: internal time
ncalls tottime percall cumtime percall filename:lineno(function)
512 0.719 0.001 0.719 0.001 {method 'recv' of '_socket.socket' objects}
1 0.464 0.464 0.473 0.473 {_socket.getaddrinfo}
1 0.352 0.352 0.352 0.352 <string>:1(connect)
1 0.248 0.248 0.348 0.348 common_functions.py:1(<module>)
1 0.022 0.022 0.075 0.075 __init__.py:2(<module>)
1 0.017 0.017 0.030 0.030 urllib.py:1442(getproxies_macosx_sysconf)
330/67 0.012 0.000 0.031 0.000 sre_parse.py:385(_parse)
real 0m2.255s
user 0m0.352s
sys 0m0.093s
Здесь 2,076- (0,352 + 0,093), т. Е. 1,631 сек. ЦП было использовано в операциях ввода / вывода (в основном _socket.socket
и _socket.getaddrinfo
).Остальное время, 2.255-2.076, было потрачено на холодный запуск кода.
Надеюсь, что это было полезно.
Обновление : в многоядерных системах, где несколькоПроцессоры работают параллельно, корпус немного другой.Общее количество секунд процессора, сообщаемое cProfile, представляет собой сумму времени, потраченного всеми процессорами индивидуально.Например: в двухъядерной системе, если один процессор работает в течение 10 секунд.Параллельно другой процессор работает в течение 15 секунд.Общее количество сообщенных секунд ЦП составит 25 секунд.Хотя в реальном времени может пройти всего 15 секунд.Следовательно, процессорное время может быть больше, чем в реальном времени в многоядерных системах. Поскольку процессоры работают параллельно