Fai correre più veloce l'orologio di un'app
Una prova di 30 giorni impiega 30 giorni a scadere, a meno che tu non possa spostare il tempo. Il consiglio abituale è portare avanti l'orologio di sistema, il che richiede i diritti di amministratore e si trascina dietro ogni altro programma della macchina. Questo sposta un solo processo.
Quanto veloce
Scegli un moltiplicatore intero. L'orologio dell'applicazione avanza quel numero di volte più veloce di quello reale, a partire dal momento in cui la sessione inizia.
| Moltiplicatore | Un minuto reale diventa | Utile per |
|---|---|---|
x60 | un'ora | job orari, timeout di sessione, durata dei token |
x1440 | un giorno | passaggi giornalieri, una prova di 30 giorni in mezz'ora |
x43200 | una prova di 30 giorni | vedere finire l'intera prova mentre leggi questo |
x525600 | un anno | rinnovi annuali, scadenza dei certificati |
x1000000 | circa 1,9 anni | il tetto |
# Partire dall'ora reale di adesso e correre di un giorno al minuto chrono run "C:\apps\test.exe" --mode x1440 # Partire da una data scelta e accelerare da lì chrono run "C:\apps\test.exe" --at 2027-12-01T09:00:00 --mode x1440 # Tenere invece l'orologio completamente fermo chrono run "C:\apps\test.exe" --mode frozen
La parte che coglie di sorpresa: ci sono due orologi
Accelerare l'orologio a muro - ciò che restituiscono DateTime.Now e
i suoi equivalenti - non accelera di per sé un conto alla rovescia. Sono due
domande diverse che un'applicazione può porre al sistema operativo, e molto software misura
«trenta giorni» con la seconda invece che con la prima.
Quindi l'asse delle durate - conteggi di tick, sleep, attese e timer - è un interruttore a parte:
--scale-durationporta sull'orologio della sessione anche i contatori di tick, le pause e i timer, mentre le attese su oggetti vengono contate e mantengono la durata reale. Senza,x1440fa correre il calendario mentre un timer di cinque secondi dura ancora cinque secondi reali - solo un timer impostato su una data e un'ora segue l'orologio della sessione in ogni sessione.--scale-qpcscala in aggiunta il contatore ad alta risoluzione. È da lì che Python 3.13+monotonic, .NETStopwatche JavananoTimeleggono il tempo trascorso, ed è disattivato per impostazione predefinita perché scalarlo ha destabilizzato il rendering nei test.
Se il moltiplicatore sembra non fare nulla a un conto alla rovescia, quasi sempre è per questo.
# Un'app timer: accelerare il calendario E i conti alla rovescia chrono run "C:\apps\Timer.exe" --mode x60 --scale-duration # Un'app Python o .NET che misura il tempo trascorso sul contatore ad alta risoluzione chrono run "C:\apps\Job.exe" --mode x60 --scale-duration --scale-qpc
Cambiare velocità senza riavviare
Il moltiplicatore può cambiare a sessione in corso, e l'orologio viene riancorato invece che fatto saltare, quindi non va mai all'indietro quando la velocità scende. Puoi anche far saltare l'orologio di colpo - in avanti, o all'indietro come fa un portatile dopo essersi risincronizzato con un server orario, che è il caso che rompe tutto ciò che misura il tempo trascorso senza una protezione.
# Correre a x60, poi passare a x1440 dopo due secondi chrono run "C:\apps\test.exe" --mode x60 --set-after 2:1440 # Correre, poi far saltare l'orologio a un momento scelto dopo cinque secondi chrono run "C:\apps\test.exe" --jump-after 5:2028-01-01T00:00:00
Che cosa non fa
- Non tocca l'orologio di sistema. È il punto, non un limite - ma significa che tutto ciò che legge l'ora da un server, da un database o da un'altra macchina non ne è influenzato, e l'audit ti dice quando succede.
- Un salto cambia ciò che l'applicazione vede, non quando si risveglia. Pause e timer già consegnati al kernel mantengono la durata ricevuta quando sono stati impostati. La maggior parte delle applicazioni interroga l'orologio, quindi in pratica i salti funzionano - ma non per tutte.
- Non rallenta il tempo. I moltiplicatori sono numeri interi da uno in su, più un orologio congelato a zero.
Se qualcosa di tutto questo sia arrivato alla tua applicazione non è da dare per scontato. Lo dice la sessione →