Ответ 1
Это отвечает на подробные сведения о значении реальных, пользовательских и временных таймингов. Цитировать:
-
"Реальное" - это часы настенных часов - время от начала до конца вызова. Эта это все прошедшее время, включая срезы времени, используемые другими процессами и время, которое процесс тратит на блокировку (например, если он ожидает ввода-вывода для завершения).
-
"Пользователь" - это количество процессорного времени, затраченного на код пользовательского режима (вне ядро) в рамках процесса. Это только фактическое время процессора, используемое в выполнение процесса. Другие процессы и время, которое тратит процесс заблокированы, не рассчитывайте на эту цифру.
-
"Sys" - это количество времени процессора, затраченного на ядро в процессе. Это означает выполнение времени CPU, затрачиваемого на системные вызовы в пределах ядра, в отличие от библиотечного кода, который все еще работает в пользовательское пространство. Подобно "пользователю", это только процессорное время, используемое процессом.
Из приведенного выше объяснения оно выглядит так, как время User + Sys должно быть равным секундам CPU. Вместо этого он ближе к "реальному" времени. Странный!
Это справедливое объяснение. Время "Пользователь" не включает в себя секунды ЦП, затраченные на операции ввода-вывода в процессе. Это просто измеряет время процессора, затрачиваемое на код пользовательского режима в памяти. Эмпирическое правило:
real time = user + 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
Здесь в операциях ввода-вывода (главным образом _socket.socket
и _socket.getaddrinfo
) потреблялось 2.076- (0.352 + 0.093), т.е. 1,631 CPU secs. Остальное время, 2.255-2.076, были потрачены на холодный старт кода.
Надеюсь, что это было полезно.
Обновление. В нескольких ядрах, где несколько процессоров работают параллельно, случай немного отличается. Общее количество секунд CPU, о которых сообщает cProfile, - это сумма времени, затрачиваемого всеми процессорами в отдельности. Например, в двухъядерной системе, если один процессор работает в течение 10 секунд. Параллельно другой процессор работает в течение 15 секунд. Общее количество секунд CPU будет составлять 25 секунд. Хотя время в реальном времени может составлять всего 15 секунд. Следовательно, время процессора может быть больше, чем в режиме реального времени в многоядерных системах. Поскольку процессоры работают параллельно