Il existe désormais une nouvelle méthode pour mesurer les microsecondes en javascript : http://gent.ilcore.com/2012/06/better-timer-for-javascript.html
Cependant, dans le passé, j'ai trouvé une méthode rudimentaire pour obtenir une précision de 0,1 milliseconde en JavaScript à partir d'un minuteur de millisecondes. Impossible ? Non, pas du tout. Continuez à lire :
Je fais des expériences de haute précision qui nécessitent des minuteries autocontrôlées, et j'ai constaté que je pouvais obtenir une précision de 0,1 milliseconde avec certains navigateurs sur certains systèmes.
J'ai constaté que dans les navigateurs Web modernes accélérés par le GPU sur des systèmes rapides (par exemple i7 quad core, où plusieurs cœurs sont inactifs, seule la fenêtre du navigateur) - je peux maintenant faire confiance aux minuteurs pour être précis à la milliseconde près. En fait, c'est devenu si précis sur un système i7 inactif que j'ai pu obtenir de manière fiable la même milliseconde exacte, sur plus de 1 000 tentatives. Ce n'est que lorsque j'essaie de faire des choses comme charger une page web supplémentaire, ou autre, que la précision en millisecondes se dégrade (et je suis capable d'attraper avec succès ma propre précision dégradée en faisant une vérification du temps avant et après, pour voir si mon temps de traitement s'est soudainement allongé à 1 ou plusieurs millisecondes - cela m'aide à invalider les résultats qui ont probablement été trop affectés par les fluctuations du CPU).
Il est devenu si précis dans certains navigateurs accélérés par le GPU sur des systèmes i7 quad-core (lorsque la fenêtre du navigateur est la seule fenêtre), que j'en suis venu à souhaiter pouvoir accéder à une minuterie d'une précision de 0,1 ms en JavaScript, puisque la précision est enfin présente sur certains systèmes de navigation haut de gamme pour rendre cette précision de minuterie intéressante pour certains types d'applications de niche qui nécessitent une haute précision, et où les applications sont capables d'auto-vérifier les écarts de précision.
Il est évident que si vous effectuez plusieurs passages, vous pouvez simplement effectuer plusieurs passages (par exemple 10 passages) puis diviser par 10 pour obtenir une précision de 0,1 milliseconde. Il s'agit d'une méthode courante pour obtenir une meilleure précision - effectuer plusieurs passes et diviser le temps total par le nombre de passes.
CEPENDANT... Si je ne peux faire qu'une seule passe de référence d'un test spécifique en raison d'une situation inhabituelle, j'ai découvert que je peux obtenir une précision de 0,1 (et parfois 0,01ms) en faisant cela :
Initialisation/Calibrage :
- Exécuter une boucle d'occupation pour attendre que la minuterie passe à la milliseconde suivante (aligner la minuterie sur le début de l'intervalle de la milliseconde suivante) Cette boucle d'occupation dure moins d'une milliseconde.
- Exécutez une autre boucle occupée pour incrémenter un compteur en attendant que le timer s'incrémente. Le compteur vous indique combien d'incréments de compteur ont eu lieu en une milliseconde. Cette boucle occupée dure une milliseconde complète.
- Répétez ce qui précède, jusqu'à ce que les chiffres deviennent ultra-stables (temps de chargement, compilateur JIT, etc.). 4. NOTE : La stabilité du nombre vous donne votre précision atteignable sur un système inactif. Vous pouvez calculer la variance, si vous avez besoin de vérifier la précision. Les variances sont plus grandes sur certains navigateurs, et plus petites sur d'autres navigateurs. Elles sont plus grandes sur les systèmes rapides et plus lentes sur les systèmes lents. La cohérence varie également. Vous pouvez déterminer quels navigateurs sont plus cohérents/précis que d'autres. Les systèmes plus lents et les systèmes occupés entraîneront des écarts plus importants entre les passes d'initialisation. Cela peut vous donner l'occasion d'afficher un message d'avertissement si le navigateur ne vous donne pas suffisamment de précision pour permettre des mesures de 0,1ms ou 0,01ms. Le décalage des minuteries peut être un problème, mais certaines minuteries en millisecondes entières sur certains systèmes s'incrémentent de manière assez précise (tout à fait sur le point), ce qui donnera des valeurs d'étalonnage très cohérentes auxquelles vous pouvez faire confiance.
- Sauvegarder la valeur finale du compteur (ou la moyenne des dernières passes d'étalonnage).
Évaluation comparative d'un passage avec une précision inférieure à la milliseconde :
- Exécutez une boucle occupée pour attendre que la minuterie passe à la milliseconde suivante (alignez la minuterie sur le début de l'intervalle de la milliseconde suivante). Cette boucle occupée dure moins d'une milliseconde.
- Exécutez la tâche que vous voulez pour évaluer précisément le temps.
- Vérifiez la minuterie. Cela vous donne le nombre entier de millisecondes.
- Exécutez une boucle finale occupée pour incrémenter un compteur en attendant l'incrémentation de la minuterie. Cette boucle occupée dure moins d'une milliseconde.
- Divisez cette valeur de compteur, par la valeur de compteur originale de l'initialisation.
- Maintenant vous avez la partie décimale des millisecondes !!!!!!!!
AVERTISSEMENT : Les boucles d'activité ne sont PAS recommandées dans les navigateurs Web, mais heureusement, ces boucles d'activité durent moins d'une milliseconde chacune et ne sont exécutées qu'un très petit nombre de fois.
Des variables telles que la compilation JIT et les fluctuations du CPU ajoutent des inexactitudes massives, mais si vous exécutez plusieurs passes d'initialisation, vous aurez une recompilation dynamique complète, et finalement le compteur se stabilise à quelque chose de très précis. Assurez-vous que toutes les boucles occupées sont exactement la même fonction dans tous les cas, de sorte que les différences dans les boucles occupées n'entraînent pas de différences. Assurez-vous que toutes les lignes de code sont exécutées plusieurs fois avant de commencer à faire confiance aux résultats, pour permettre aux compilateurs JIT de s'être déjà stabilisés à une recompilation dynamique complète (dynarec).
En fait, j'ai été témoin d'une précision approchant les microsecondes sur certains mais je ne lui ferais pas encore confiance. Mais la précision de 0,1 milliseconde semble fonctionner de manière assez fiable, sur un système quad-core inactif où je suis la seule page du navigateur. Je suis arrivé à un cas de test scientifique où je ne pouvais faire que des passes uniques (en raison de variables uniques), et j'avais besoin de chronométrer précisément chaque passe, plutôt que de faire la moyenne de plusieurs passes répétées, c'est pourquoi j'ai fait cela.
J'ai fait plusieurs pré-passes et passes fictives (aussi pour régler le dynarec), pour vérifier la fiabilité de la précision de 0.1ms (restée solide pendant plusieurs secondes), puis j'ai gardé mes mains hors du clavier/souris, pendant que le benchmark se produisait, puis j'ai fait plusieurs post-passes pour vérifier la fiabilité de la précision de 0.1ms (restée solide à nouveau). Cela permet également de vérifier que des choses telles que des changements d'état d'alimentation, ou d'autres choses, ne se sont pas produites entre l'avant et l'après, interférant avec les résultats. Répétez le pré-test et le post-test entre chaque passage du benchmark. De cette manière, j'étais pratiquement certain que les résultats intermédiaires étaient exacts. Il n'y a pas de garantie, bien sûr, mais cela montre qu'une précision de <0,1ms est possible dans le cadre d'un projet de recherche. un peu de dans un navigateur web.
Cette méthode n'est utile que dans les cas très, très niche cas. Même ainsi, il ne sera littéralement pas garanti à l'infini à 100%, vous pouvez obtenir une précision tout à fait digne de confiance, et même une précision scientifique lorsqu'elle est combinée à plusieurs couches de vérifications internes et externes.