This answers splendidamente dettagli sul significato di vera e propria, i tempi dell'utente e del sistema. Per quotare:
'Reale' è l'ora dell'orologio da parete - tempo dall'inizio alla fine della chiamata. Questo è tutto il tempo trascorso, comprese le fasce orarie utilizzate da altri processi e tempo di attesa del processo (ad esempio se è in attesa di I/O da completare).
'Utente' è la quantità di tempo impiegato dalla CPU nel codice in modalità utente (all'esterno del kernel ) all'interno del processo. Questo è solo il tempo effettivo della CPU utilizzato in in esecuzione del processo. Altri processi e tempi trascorsi dal processo bloccati non vengono conteggiati per questa cifra.
'Sys' è la quantità di tempo CPU trascorso nel kernel all'interno del processo. Ciò significa eseguire il tempo di CPU trascorso nelle chiamate di sistema all'interno del kernel , al contrario del codice di libreria, che è ancora in esecuzione nello spazio utente . Come "utente", questa è solo la CPU utilizzata dal processo.
Dalla spiegazione precedente appare come il tempo di utente + Sys dovrebbe essere uguale ai secondi della CPU. Invece, è più vicino al tempo "reale". Strano!
C'è una spiegazione equa per questo. L'ora dell'utente è non include i secondi CPU impiegati per le operazioni di I/O all'interno del processo. Misura solo il tempo impiegato dalla CPU per il codice in modalità utente all'interno della memoria . La regola generale è:
tempo reale = utente + sys + tempo di I/O + interprete tempo di avvio + bytecode tempo di compilazione
per convalidare questa ho fatto una urllib2.urlopen(urllib2.Request(url))
chiamata a fare I intensiva/O .Ecco i risultati:
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
Qui, 2.076- (0,352 + 0,093), cioè, 1.631 secondi CPU sono stati consumati nelle operazioni di I/O (principalmente _socket.socket
e _socket.getaddrinfo
). Il resto del tempo, 2.255-2.076, è stato speso all'inizio a freddo del codice.
Spero che sia stato utile.
Aggiornamento: in più sistemi core, dove più CPU lavorano in parallelo, il caso è leggermente diverso. Totale secondi CPU riportati da cProfile è la somma totale del tempo trascorso da tutte le CPU individualmente. Ad esempio: in un sistema a 2 core, se una CPU funziona per 10 secondi. In parallelo, un'altra CPU funziona per 15 secondi. I secondi totali della CPU riportati saranno 25 secondi. Anche se il tempo reale trascorso può essere solo 15 secondi. Quindi il tempo della CPU può essere maggiore del tempo reale nei sistemi multi core. Mentre le CPU funzionano in parallelo
Se si esegue questa temporizzazione con un'altra attività intensiva della CPU in esecuzione, i numeri corrispondono ancora? –
Ignora - ha frainteso la domanda – cdarke