Entendiendo time.perf_counter () y time.process_time ()

Tengo algunas preguntas sobre las nuevas funciones time.perf_counter() y time.process_time() .

Para los primeros, a partir de la documentación:

Devuelva el valor (en fracciones de segundos) de un contador de rendimiento, es decir, un reloj con la resolución más alta disponible para medir una duración corta. Incluye el tiempo transcurrido durante la suspensión y se aplica a todo el sistema. El punto de referencia del valor devuelto no está definido, por lo que solo la diferencia entre los resultados de llamadas consecutivas es válida.

¿Es esta ‘resolución más alta’ la misma en todos los sistemas? ¿O siempre depende ligeramente si, por ejemplo, usamos Linux o Windows?
La pregunta proviene del hecho de que al leer la documentación de time.time() dice que “no todos los sistemas proporcionan tiempo con una mejor precisión que 1 segundo”, ¿cómo pueden ahora proporcionar una resolución mejor y más alta?

Sobre este último, time.process_time() :

Devuelva el valor (en segundos fraccionarios) de la sum del sistema y el tiempo de CPU del usuario del proceso actual. No incluye el tiempo transcurrido durante el sueño. Es todo el proceso por definición. El punto de referencia del valor devuelto no está definido, por lo que solo la diferencia entre los resultados de llamadas consecutivas es válida.

No entiendo, ¿qué son esos ‘tiempo de sistema’ y ‘tiempo de CPU del usuario’? ¿Cual es la diferencia?

Hay dos tipos distintos de “tiempo”, en este contexto: tiempo absoluto y tiempo relativo.

El tiempo absoluto es el “tiempo del mundo real”, que se devuelve con time.time() y que todos estamos acostumbrados a tratar. Por lo general, se mide desde un punto fijo en el tiempo en el pasado (por ejemplo, la época de UNIX de 00:00:00 UTC el 01/01/1970) en una resolución de al menos 1 segundo. Los sistemas modernos generalmente proporcionan una resolución de milisegundos o microsegundos. Es mantenido por el hardware dedicado en la mayoría de las computadoras, el circuito RTC (reloj de tiempo real) normalmente funciona con baterías, por lo que el sistema realiza un seguimiento del tiempo real entre los power-ups. Este “tiempo real” también está sujeto a modificaciones según su ubicación (zonas horarias) y temporada (horario de verano) o se expresa como un desplazamiento de UTC (también conocido como hora GMT o Zulú).

En segundo lugar, hay un tiempo relativo, que es devuelto por time.perf_counter y time.process_time . Este tipo de tiempo no tiene una relación definida con el tiempo real, en el sentido de que la relación es específica del sistema y la implementación. Solo se puede utilizar para medir intervalos de tiempo, es decir, un valor sin unidades que es proporcional al tiempo transcurrido entre dos instantes. Esto se usa principalmente para evaluar el rendimiento relativo (por ejemplo, si esta versión del código se ejecuta más rápido que esa versión del código).

En los sistemas modernos, se mide utilizando un contador de CPU que aumenta monótonamente a una frecuencia relacionada con el reloj del hardware de la CPU. La resolución del contador depende en gran medida del hardware del sistema, el valor no se puede relacionar de manera confiable con el tiempo real o incluso se puede comparar entre sistemas en la mayoría de los casos. Además, el valor del contador se restablece cada vez que la CPU se enciende o se reinicia.

time.perf_counter devuelve el valor absoluto del contador. time.process_time es un valor que se deriva del contador de la CPU pero se actualiza solo cuando un proceso dado se ejecuta en la CPU y se puede desglosar en ‘tiempo de usuario’, que es el momento en que el proceso se está ejecutando en la CPU, y ‘hora del sistema’, que es el momento en el que el núcleo del sistema operativo se ejecuta en la CPU en nombre del proceso.