La milliseconde en VBScript, mythe ou réalité ?

Venez ici si vous souhaitez discuter, émettre une suggestion, ou encore demander de l'aide ;)
moums3
Messages : 4
Inscription : 15 février 2017, 15:28

La milliseconde en VBScript, mythe ou réalité ?

Message par moums3 » 19 mai 2018, 14:59

Bonjour,
ayant eu à chronométrer, en VBScript, des temps d'exécution de programmes, je suis allé voir sur Intenet ce que je pouvais trouver.
J'ai été très déçu !
J'ai donc décidé de me débrouiller seul.
Or il se trouve que j'ai l'habitude de ne déclarer et d'initiliser une variable QUE si je m'en sers au minimum deux fois et de vérifier régulièrement, au moyen d'un "WScript.Echo", l'évolution du programme en cours de réalisation.
Cette habitude m'a fait apparaître des résultats surprenants.
Exemple d'une séquence de code avec emploi maximal de variables :

Code : Tout sélectionner

t1 = Timer
...
...
t2 = Timer
WScript.echo FormatNumber(t2 - t1, 3)
L'affichage, en répétant cette séquence, montre systématiquement un beau zéro pour les millisecondes. Soit et adieu aux millisecondes !

En supprimant la variable t2 utilisée une seule fois, ce code devient :

Code : Tout sélectionner

t1 = Timer
...
...
WScript.Echo FormatNumber(Timer - t1,3)
L'affichage, en répétant cette séquence, est capable d'afficher des millisecondes. Étrange n'est-ce pas !

Autre chose liée : l'instruction "WScript.Sleep(n)" où n est le nombre de millisecondes de l'attente, oui il s'agit de millisecondes !

J'ai cherché et j'ai trouvé une instruction toute bête : "t1 = Timer + 0.1 - 0.1", t1 peut contenir jusqu'à 8 décimales (la dernière n'étant pas nulle) mais avec une particularité : le nombre formé par les deux derniers chiffres est soit 25, soit 50, soit 75...

J'ai décidé, pour mon usage personnel, de ne pas utiliser les fractions de millisecondes.

J'ai donc écrit un VBScript nommé Timer.vbs que vous trouverez ci-dessous (attention, il y a pas mal d'espaces inutiles supprimés) pour que vous puissiez vérifier la véracité de ce que j'avance.

Code : Tout sélectionner

Option Explicit
Dim i,n,s,sep,t1,t2
sep=WScript.CreateObject("WScript.shell").RegRead("HKCU\Control Panel\International\sDecimal")
s="Dans chaque boucle :"&VbCr&"_""t1"" est ce que retourne la fonction"&VbCr&"  ""Timer()"" avec l'affi"&_
"chage de 3 déci-"&VbCr&"  males,"&VbCr&"_le premier ""t2"" est affiché sans les"&VbCr&"  zéros en part"&_
"ant de la droite,"&VbCr&"_le deuxième ""t2"" est affiché avec 4"&VbCr&"  décimales."&VbCr&VbCr
i=0
Do
	i=i+1
	t1=Timer REM "t1" n'a que 2 décimales utilisables
	WScript.Sleep(Int(t1/1000))
	t2=Timer+0.1-0.1 REM ajout et retrait du même nombre DÉCIMAL (ici 0,1) => "t2" a jusqu'à 8 décimales utilisables !
	s=s&"Boucle "&i&VbCr&"t1 = "&FormatNumber(t1,3)&VbCr&"t2 = "
	n=t2
	If n<>0 Then
		Do
			If Right(n,1)="0" and n<>"0" Then n=Left(n,Len(n)-1) Else Exit Do
		Loop
		n=Len(n)-InStr(n,sep)
		s=s&FormatNumber(t2,n)
	Else
		s=s&"0"
	End If
	s=s&VbCr&"t2 = "&FormatNumber(t2,4)&VbCr&VbCr
Loop Until i=7 REM nombre de boucles
WScript.Echo s&"CONCLUSION : en ajoutant et en"&VbCr&"retranchant le même nombre DÉ-"&VbCr&"CIMAL lors "&_
"de l'appel à ""Timer"","&VbCR&"des décimales ""cachées"" ap-"&VbCr&"paraissent."&VbCr&_
VbCr&"Remarquez :"&VbCr&"_les millièmes de ""t1"" sont nuls,"&VbCr&"_l'éventuel arrondi du dernier chif"&_
"-"&VbCr&"  fre du dernier ""t2"" de chaque bou-"&VbCr&"  cle."&VbCr&VbCr&"CONSEIL : demandez, au maxim"&_
"um,"&VbCr&"4 décimales."&VbCr&"Exemple :"&VbCr&"""FormatNumber(Timer+0.1-0.1,4)"""
Ce que j'ai vu sur plusieurs sites : multiplier par 1000 la partie décimale de ce que retourne la fonction "Timer", les personnes qui préconisent cette ânerie n'ont jamais remarqué la nullité systématique des millisecondes !

Juste un petit mot : ce VBScript crée une fenêtre pour afficher les résultats, cette fenêtre est volontairement étroite et haute, si la hauteur est trop importante, diminuez le nombre "7" de boucles (ligne 25 : Loop Until i=7)…

À bientôt,
moums3
Une idée n'est bonne que lorsqu'elle est partagée.

Etre_Libre
Administrateur
Messages : 629
Inscription : 13 novembre 2012, 21:44

Re: La milliseconde en VBScript, mythe ou réalité ?

Message par Etre_Libre » 19 mai 2018, 15:51

Bonjour,

Merci pour ce partage, bien pointu ;)

Répondre