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

Archives de discussions et demandes informatiques.
moums3

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

Message par moums3 »

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 ' "t1" n'a que 2 décimales utilisables
	WScript.Sleep(Int(t1/1000))
	t2=Timer+0.1-0.1 ' 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 ' 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)…

Modification du 8 juillet 2018 : j'ai remplacé les "REM" non situés en début de ligne de "Timer.vbs" par une apostrophe pour éviter un rejet par l'interpréteur "wscript.exe ou "cscript.exe".

À bientôt,
moums3
Dernière modification par moums3 le 08 juillet 2018, 11:21, modifié 1 fois.
Etre_Libre
Administrateur
Messages : 800
Inscription : 13 novembre 2012, 21:44

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

Message par Etre_Libre »

Bonjour,

Merci pour ce partage, bien pointu ;)
moums3

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

Message par moums3 »

Bonjour à tous,
j'ajoute un complément d'information.
Voici un petit programme qui mémorise dans des variables t1 à t61 des temps, de façon à obtenir le maximum de décimales puis qui affiche les différences tn - t1 (limitées à 8 décimales) où n varie de 2 à 61.

Code : Tout sélectionner

Option Explicit
Dim i,n,s
n=61'nb boucles
For i=1 to n
  Execute("t"&i&"=Timer+0.1-0.1")
Next
For i=2 to n
  Execute("s=s&FormatNumber(t"&i&"-t1,8)&VbCr")
Next
WScript.Echo s
Cela permet de vérifier la validité des éventuelles millisecondes…
Vous pouvez ainsi constater que la fonction "Timer" retourne un temps avec un pas dont j'ai remarqué deux valeurs : 3,90625ms ou 15,625ms !

Conclusion : la milliseconde est parfaitement illusoire, le centième de seconde peut être approximatif !

Nota :
_ pour savoir si la commande "Execute()" est correctement écrite faites un WScript.Echo
    exemple pour i = 8 : WScript.Echo "t"&8&"=Timer+0.1-0.1" doit afficher t8=Timer+0.1-0.1
_ bien que ce VBScript commence par "Option Explicit", aucune des variables de t1 à t61 n'est déclarée…

À bientôt,
moums3
Répondre