Die aktuelle Zeit ist älter als die zuvor gespeicherte Zeit

8

Ich gehe davon aus, dass die Zeit immer vorwärts läuft, aber anscheinend passiert das manchmal nicht so.

Ich habe das folgende Beispiel:

%Vor%

Jetzt funktioniert es meistens wie erwartet, und diff zeigt eine Zahl nahe 100 an. Natürlich würde ich im realen Szenario erwarten, dass die Zahl steigt, besonders wenn der Computer des Benutzers ist einige schwere Operationen durchführen.

Was ich nicht erwarte, ist eine negative Zahl zu sehen, und doch passiert es. Wie ist es möglich? Fehle ich etwas? Ich dachte, es könnte durch eine andere Zeitzone verursacht werden, aber das ist es nicht. Ich sehe es auch in verschiedenen Browsern (Chrome, Firefox, Safari), und die diff-Werte sind ziemlich inkonsistent: alles von -9 bis -100 000.

Es passiert in etwa 0,025% der Fälle bei der Produktion, also ist das kein großes Problem, aber ich frage mich, wie um alles in der Welt kann es (vielleicht sogar theoretisch) passieren?

Ich denke, ich habe es ein paar Mal lokal reproduziert, indem ich das Skript in einer langsamen VM ausgeführt habe und hohe CPU-Last emuliert habe, aber ich sehe immer noch nicht, warum die Funktion eine negative Zahl anzeigen würde ( now ). ist älter als prevCall ).

    
Daniel J F 06.04.2017, 09:48
quelle

4 Antworten

3
___ qstntxt ___

Ich gehe davon aus, dass die Zeit immer vorwärts läuft, aber anscheinend passiert das manchmal nicht so.

Ich habe das folgende Beispiel:

%Vor%

Jetzt funktioniert es meistens wie erwartet, und ntpd zeigt eine Zahl nahe 100 an. Natürlich würde ich im realen Szenario erwarten, dass die Zahl steigt, besonders wenn der Computer des Benutzers ist einige schwere Operationen durchführen.

Was ich nicht erwarte, ist eine negative Zahl zu sehen, und doch passiert es. Wie ist es möglich? Fehle ich etwas? Ich dachte, es könnte durch eine andere Zeitzone verursacht werden, aber das ist es nicht. Ich sehe es auch in verschiedenen Browsern (Chrome, Firefox, Safari), und die diff-Werte sind ziemlich inkonsistent: alles von -9 bis -100 000.

Es passiert in etwa 0,025% der Fälle bei der Produktion, also ist das kein großes Problem, aber ich frage mich, wie um alles in der Welt kann es (vielleicht sogar theoretisch) passieren?

Ich denke, ich habe es ein paar Mal lokal reproduziert, indem ich das Skript in einer langsamen VM ausgeführt habe und hohe CPU-Last emuliert habe, aber ich sehe immer noch nicht, warum die Funktion eine negative Zahl anzeigen würde ( %code% ). ist älter als %code% ).

    
___ qstnhdr ___ Die aktuelle Zeit ist älter als die zuvor gespeicherte Zeit ___ answer43307688 ___

1. Sie haben eine ungenaue Gleichung, die auch bei hochgenauen IE-Timern über ein Verzögerungszitat mindestens -1 zu +1 ergibt. Das ist normal.

2. Timer haben eine niedrige Priorität Ausführung und sogar die kleinste Client-Maus-Seite Interaktion kann es sein Intervall ein paar ms aus.

Alle anderen Synchronisationsoperationen, Funktionen und Ereignisse bringen sie (Timer) zum Stillstand und verursachen eine noch größere Menge an Störung des gegebenen Intervalls.

    
___ answer43305947 ___

%code% ist eine globale Variable mit einem generischen Namen - ist es möglich, dass eine andere Funktion darauf schreibt?

    
___ tag123javascript ___ JavaScript (nicht zu verwechseln mit Java) ist eine dynamische Sprache mit mehreren Paradigmen auf hoher Ebene, die sowohl für das clientseitige als auch für das serverseitige Scripting verwendet wird. Verwenden Sie dieses Tag für Fragen zu ECMAScript und seinen verschiedenen Dialekten / Implementierungen (außer ActionScript und Google-Apps-Script). ___ antwort43311537 ___

Die meisten Computer sind so konfiguriert, dass sie NTP-Server verwenden, um die Systemuhr einzustellen.

Da die Systemuhr beim ersten Mal eingestellt wird, bleibt sie normalerweise ohne Aktualisierung synchron.

Manchmal (selten) kann die Systemuhr aus verschiedenen Gründen nicht mehr synchron sein.

Da die Systemuhr nicht mit der Zeit des NTP-Servers übereinstimmt, wird sie aktualisiert und kann rückwärts gehen.

NTP-Dienste sind (normalerweise) so konfiguriert, dass die Uhr nicht rückwärts läuft: Wenn die "Lücke" klein genug ist, versucht der NTP-Dämon stattdessen, die Systemuhr zu verlangsamen, bis sie wieder in sysnc ist. Aber wie gesagt, das hängt von der Konfiguration und der Größe der Zeitlücke ab.

Ich denke, dass all das oben genannte in seltenen Fällen das Problem verursacht, das Sie sehen.

Vielleicht finden Sie das interessant: Gibt es eine Möglichkeit, sicherzustellen, dass die synchronisierte ntp-Uhr niemals rückwärts läuft?

Wenn Sie auf macOS sind, versuchen Sie vielleicht, die Konsole zu öffnen und nach %code% zu suchen.

Auf meinem Rechner (ein MBP mit 10.9.5) sehe ich ein paar Zeilen wie diese ...

%Vor%

... das eine Systemtaktanpassung protokolliert.

    
___ tag123time ___ Die Zeit messen, die benötigt wird, um eine Operation auszuführen. Außerdem Fragen zum Ermitteln der aktuellen Uhrzeit, Berechnen von Zeiten, Formatierungs- und Parsingzeiten usw. ___ answer43311255 ___

Tatsächlich ist es ziemlich einfach, dies zu erreichen, indem Sie die Zeit auf Ihrem Computer ändern.

Es ist schwierig, dieses Problem generisch zu lösen, aber Sie können etwas cleveres für ein spezifischeres Problem finden. Zum Beispiel, wenn Sie eine Countdown-Uhr auf Ihrer Website zeigen, dann kann Ihr Server sagen, was die GMT-Startzeit ist, was sie denkt "jetzt" und wie viele Sekunden bleiben. Wenn die Dinge "schief gehen" *, können Sie Ihren Server nach den gleichen Informationen fragen, und mit diesen Informationen können Sie die lokale Zeit auf dem Computer vergleichen. Im Grunde genommen können Sie die Serverzeit als Referenzpunkt und nicht als Zeit des Frontends verwenden.

Falsch * - Damit meine ich, dass der Timer negativ wird oder dass seit der letzten Ausführung zu viel Zeit vergangen ist. Zu viel Zeit könnte 20 Sekunden bedeuten.

    
___
Paolo 09.04.2017, 20:24
quelle
1

prevCall ist eine globale Variable mit einem generischen Namen - ist es möglich, dass eine andere Funktion darauf schreibt?

    
Michael Bar-Sinai 09.04.2017 11:01
quelle
0

1. Sie haben eine ungenaue Gleichung, die auch bei hochgenauen IE-Timern über ein Verzögerungszitat mindestens -1 zu +1 ergibt. Das ist normal.

2. Timer haben eine niedrige Priorität Ausführung und sogar die kleinste Client-Maus-Seite Interaktion kann es sein Intervall ein paar ms aus.

Alle anderen Synchronisationsoperationen, Funktionen und Ereignisse bringen sie (Timer) zum Stillstand und verursachen eine noch größere Menge an Störung des gegebenen Intervalls.

    
Bekim Bacaj 09.04.2017 14:09
quelle
0

Tatsächlich ist es ziemlich einfach, dies zu erreichen, indem Sie die Zeit auf Ihrem Computer ändern.

Es ist schwierig, dieses Problem generisch zu lösen, aber Sie können etwas cleveres für ein spezifischeres Problem finden. Zum Beispiel, wenn Sie eine Countdown-Uhr auf Ihrer Website zeigen, dann kann Ihr Server sagen, was die GMT-Startzeit ist, was sie denkt "jetzt" und wie viele Sekunden bleiben. Wenn die Dinge "schief gehen" *, können Sie Ihren Server nach den gleichen Informationen fragen, und mit diesen Informationen können Sie die lokale Zeit auf dem Computer vergleichen. Im Grunde genommen können Sie die Serverzeit als Referenzpunkt und nicht als Zeit des Frontends verwenden.

Falsch * - Damit meine ich, dass der Timer negativ wird oder dass seit der letzten Ausführung zu viel Zeit vergangen ist. Zu viel Zeit könnte 20 Sekunden bedeuten.

    
Parris 09.04.2017 19:57
quelle

Tags und Links