Es gibt jetzt eine neue Methode zum Messen von Mikrosekunden in Javascript:
http://gent.ilcore.com/2012/06/better-timer-for-javascript.html
In der Vergangenheit habe ich jedoch eine grobe Methode gefunden, um aus einem Millisekunden-Timer eine Genauigkeit von 0,1 Millisekunden in JavaScript zu erhalten. Unmöglich? Nee. Weiter lesen:
Ich mache einige hochpräzise Experimente, die selbst überprüfte Timergenauigkeiten erfordern, und habe festgestellt, dass ich mit bestimmten Browsern auf bestimmten Systemen zuverlässig eine Genauigkeit von 0,1 Millisekunden erzielen konnte.
Ich habe festgestellt, dass in modernen GPU-beschleunigten Webbrowsern auf schnellen Systemen (z. B. i7 Quad Core, wo mehrere Kerne inaktiv sind, nur Browserfenster) - ich kann jetzt darauf vertrauen, dass die Timer millisekundengenau sind. Tatsächlich ist es auf einem i7-System im Leerlauf so genau geworden, dass ich über mehr als 1.000 Versuche zuverlässig genau dieselbe Millisekunde erhalten konnte. Nur wenn ich versuche, eine zusätzliche Webseite oder eine andere zu laden, verschlechtert sich die Millisekundengenauigkeit (und ich kann meine eigene verschlechterte Genauigkeit erfolgreich erfassen, indem ich eine Vorher-Nachher-Zeitprüfung durchführe, um festzustellen, ob Meine Verarbeitungszeit verlängerte sich plötzlich auf 1 oder mehr Millisekunden - dies hilft mir, Ergebnisse ungültig zu machen, die wahrscheinlich zu stark durch CPU-Schwankungen beeinträchtigt wurden.
Es ist in einigen GPU-beschleunigten Browsern auf i7 Quad-Core-Systemen so genau geworden (wenn das Browserfenster das einzige Fenster ist), dass ich mir gewünscht habe, ich könnte auf einen 0,1-ms-Präzisions-Timer in JavaScript zugreifen, da die Genauigkeit jetzt endlich ist Es gibt einige High-End-Browsersysteme, mit denen sich eine solche Timer-Präzision für bestimmte Arten von Nischenanwendungen lohnt, die eine hohe Präzision erfordern und bei denen die Anwendungen in der Lage sind, sich auf Genauigkeitsabweichungen zu überprüfen.
Wenn Sie mehrere Durchgänge ausführen, können Sie natürlich einfach mehrere Durchgänge ausführen (z. B. 10 Durchgänge) und dann durch 10 dividieren, um eine Genauigkeit von 0,1 Millisekunden zu erhalten. Dies ist eine gängige Methode, um eine bessere Präzision zu erzielen. Führen Sie mehrere Durchgänge durch und teilen Sie die Gesamtzeit durch die Anzahl der Durchgänge.
JEDOCH ... Wenn ich aufgrund einer ungewöhnlich einzigartigen Situation nur einen einzigen Benchmark-Durchgang eines bestimmten Tests durchführen kann, habe ich festgestellt, dass ich auf diese Weise eine Genauigkeit von 0,1 (und manchmal 0,01 ms) erreichen kann:
Initialisierung / Kalibrierung:
- Führen Sie eine Besetztschleife aus, um zu warten, bis der Timer auf die nächste Millisekunde erhöht wird (richten Sie den Timer auf den Beginn des nächsten Millisekundenintervalls aus). Diese Besetztschleife dauert weniger als eine Millisekunde.
- Führen Sie eine weitere Besetztschleife aus, um einen Zähler zu erhöhen, während Sie darauf warten, dass der Timer erhöht wird. Der Zähler gibt an, wie viele Zählerinkremente in einer Millisekunde aufgetreten sind. Diese belebte Schleife dauert eine volle Millisekunde.
- Wiederholen Sie den obigen Vorgang, bis die Zahlen extrem stabil sind (Ladezeit, JIT-Compiler usw.). 4. HINWEIS: Die Stabilität der Nummer gibt Ihnen Ihre erreichbare Präzision auf einem Leerlaufsystem. Sie können die Varianz berechnen, wenn Sie die Genauigkeit selbst überprüfen müssen. Die Abweichungen sind bei einigen Browsern größer und bei anderen Browsern kleiner. Größer auf schnelleren Systemen und langsamer auf langsameren Systemen. Die Konsistenz variiert ebenfalls. Sie können feststellen, welche Browser konsistenter / genauer sind als andere. Langsamere und ausgelastete Systeme führen zu größeren Abweichungen zwischen den Initialisierungsdurchläufen. Dies kann Ihnen die Möglichkeit geben, eine Warnmeldung anzuzeigen, wenn der Browser Ihnen nicht genügend Genauigkeit bietet, um Messungen von 0,1 ms oder 0,01 ms zu ermöglichen. Timer-Versatz kann ein Problem sein, aber einige ganzzahlige Millisekunden-Timer auf einigen Systemen werden ziemlich genau inkrementiert (genau auf den Punkt genau), was zu sehr konsistenten Kalibrierungswerten führt, denen Sie vertrauen können.
- Speichern Sie den endgültigen Zählerwert (oder den Durchschnitt der letzten Kalibrierungsdurchläufe).
Benchmarking eines Durchgangs mit einer Genauigkeit von weniger als einer Millisekunde:
- Führen Sie eine Besetztschleife aus, um zu warten, bis der Timer auf die nächste Millisekunde erhöht wird (richten Sie den Timer auf den Beginn des nächsten Millisekundenintervalls aus). Diese belebte Schleife dauert weniger als eine Millisekunde.
- Führen Sie die Aufgabe aus, für die Sie die Zeit genau messen möchten.
- Überprüfen Sie den Timer. Dies gibt Ihnen die ganzzahligen Millisekunden.
- Führen Sie eine letzte Besetztschleife aus, um einen Zähler zu erhöhen, während Sie darauf warten, dass der Timer erhöht wird. Diese belebte Schleife dauert weniger als eine Millisekunde.
- Teilen Sie diesen Zählerwert durch den ursprünglichen Zählerwert aus der Initialisierung.
- Jetzt hast du den Dezimalteil von Millisekunden !!!!!!!!
WARNUNG: Busy-Loops werden in Webbrowsern NICHT empfohlen. Glücklicherweise werden diese Busy-Loops jeweils weniger als 1 Millisekunde lang ausgeführt und nur sehr wenige Male ausgeführt.
Variablen wie die JIT-Kompilierung und CPU-Schwankungen führen zu massiven Ungenauigkeiten. Wenn Sie jedoch mehrere Initialisierungsdurchläufe ausführen, erhalten Sie eine vollständige dynamische Neukompilierung, und schließlich wird der Zähler auf etwas sehr Genaues eingestellt. Stellen Sie sicher, dass alle Besetztschleifen in allen Fällen genau dieselbe Funktion haben, damit Unterschiede in Besetztschleifen nicht zu Unterschieden führen. Stellen Sie sicher, dass alle Codezeilen mehrmals ausgeführt werden, bevor Sie den Ergebnissen vertrauen, damit sich JIT-Compiler bereits zu einer vollständigen dynamischen Neukompilierung (Dynarec) stabilisiert haben.
Tatsächlich habe ich auf bestimmten Systemen eine Präzision gesehen, die sich Mikrosekunden nähert , aber ich würde ihr noch nicht vertrauen. Aber die Genauigkeit von 0,1 Millisekunden scheint auf einem inaktiven Quad-Core-System, auf dem ich die einzige Browserseite bin, ziemlich zuverlässig zu funktionieren. Ich kam zu einem wissenschaftlichen Testfall, in dem ich nur einmalige Durchgänge durchführen konnte (aufgrund eindeutiger Variablen), und musste jeden Durchgang genau zeitlich festlegen, anstatt mehrere Wiederholungsdurchläufe zu mitteln. Deshalb habe ich dies getan.
Ich habe mehrere Pre-Pässe und Dummy-Pässe durchgeführt (auch um den Dynarec zu regeln), um die Zuverlässigkeit mit einer Genauigkeit von 0,1 ms zu überprüfen (blieb einige Sekunden lang solide), dann habe ich meine Hände von der Tastatur / Maus gelassen, während der Benchmark stattfand, und dann mehrere Nachdurchläufe zur Überprüfung der Zuverlässigkeit mit einer Genauigkeit von 0,1 ms (blieb wieder solide). Dies stellt auch sicher, dass Dinge wie Änderungen des Energiezustands oder andere Dinge zwischen dem Vorher und Nachher nicht aufgetreten sind und die Ergebnisse beeinträchtigen. Wiederholen Sie den Vor- und Nach-Test zwischen jedem einzelnen Benchmark-Durchgang. In diesem Zusammenhang war ich mir ziemlich sicher, dass die dazwischen liegenden Ergebnisse korrekt waren. Es gibt natürlich keine Garantie, aber es zeigt, dass in einem Webbrowser in einigen Fällen eine Genauigkeit von <0,1 ms möglich ist .
Diese Methode ist nur in sehr, sehr Nischenfällen nützlich . Trotzdem ist es buchstäblich nicht 100% ig garantiert, Sie können eine sehr vertrauenswürdige Genauigkeit und sogar wissenschaftliche Genauigkeit erzielen, wenn Sie es mit mehreren Ebenen interner und externer Überprüfungen kombinieren.