La razón por la que solo se aplica a los navegadores es porque no hay manera de eliminar completamente la información de tiempo de alta resolución del código que se ejecuta de forma nativa. Por ejemplo, la instrucción RDTSC
proporciona información precisa sobre el tiempo de resolución en sub-nanosegundos para cualquier proceso. Si bien es posible deshabilitar esta instrucción haciéndola ejecutable solo por un código privilegiado (al establecer el CR4.TSD
bit), gran parte del usuario depende de ella. Sin embargo, incluso si lo deshabilitó exitosamente sin romperse, un temporizador de resolución similar podría ser manipulado incrementando una variable en un ciclo rápido. El código de espacio de usuario siempre tendrá información de tiempo de precisión de nanosegundos. Dicho temporizador podría implementarse fácilmente:
register volatile unsigned long counter;
void counter_thread(void)
{
while (1) counter++;
}
La función counter_thread()
se ejecutaría en su propio hilo, y en otro hilo, el valor de counter
podría muestrearse en un momento arbitrario. Como la tasa de incremento del contador sería muy alta y bastante constante, proporcionaría un temporizador de alta resolución similar a RDTSC
.
Como resultado, no hay forma de ocultar información precisa de tiempo de ningún proceso que se ejecute directamente en la CPU. Solo es posible en JavaScript porque es un lenguaje administrado de alto nivel que no tiene acceso directo a las instrucciones de la CPU, y el tiempo debe ir a través de API dedicadas como performance.now()
, que puede tener su granularidad ajustada modificando el motor de JavaScript. .