LaBouaBouate

Cours PowerShell #5 - Top chrono !

Consigne

On ajoute un chronomètre qui se lance après que le script ait reçu la première réponse du joueur. Ce chronomètre s’arrêtera juste avant d’afficher les résultats, qui inclurons maintenant le temps total en secondes pour la résolution (arrondi à 0.001 seconde) et le temps moyen par essai (également arrondi à 0.001 seconde).

Résultat attendu

VICTOIRE ! Vous avez deviné le nombre aléatoire

Nombre aléatoire          : 198
Réponses                  : {500, 250, 125, 200...}
Réponse moyenne           : 216
Tentatives                : 10
Temps de résolution (sec) : 16,036
Temps moyen par tentative : 1,604

Étape par étape

  1. Créer et lancer un chronomètre
  2. Stopper le chronomètre
  3. Afficher le temps de résolution
  4. Formater du temps de résolution
  5. Calculer et afficher le temps par coup

Créer et lancer un chronomètre

Pour mesure un temps d’exécution, il existe deux méthodes principales en PowerShell :

On peut également mentionner la commande Measure-Command qui permet de mesurer le temps d’exécution d’un bloc de script, mais celle-ci ne convient pas à notre usage car notre début se situe dans une boucle et la fin se trouve en dehors de cette boucle (le bloc de script n’est donc pas entier).

Avant de lancer le chronomètre, on va juste s’assurer qu’un chronomètre n’est pas déjà en cours d’exécution (puisque le départ se trouve dans la boucle). Pour faire ça, plusieurs méthodes sont possibles :

# Pour "Get-Date" & "New-TimeSpan"
if (!$startTime) { $startTime = Get-Date }

# Pour "System.Diagnostics.Stopwatch"
$stopwatch = [System.Diagnostics.Stopwatch]::New()
if ($stopwatch.IsRunning -eq $false) { $stopwatch.Start() }

Stopper le chronomètre

Pour arrêter le chronomètre, tout dépend du type de chronomètre que l’on utilise :

# Pour "Get-Date" & "New-TimeSpan"
$stopwatch = New-TimeSpan -Start $startTime

# Pour "System.Diagnostics.Stopwatch"
$stopwatch.Stop()

Afficher le temps de résolution

Le temps total de résolution en secondes est stocké dans la propriété TotalSeconds du chronomètre.

# Pour "Get-Date" & "New-TimeSpan"
$stopwatch.TotalSeconds

# Pour "System.Diagnostics.Stopwatch"
$stopwatch.Elapsed.TotalSeconds

Formater du temps de résolution

Pour arrondir le temps total de résolution au millième de seconde (0.001 seconde), on utilise la classe .NET [System.Math] qui prend deux paramètres : le premier est la valeur à arrondir et le deuxième est le nombre de décimales que l’on doit conserver (dans notre cas : 3).

[System.Math]::Round($stopwatch.Elapsed.TotalSeconds,3)

Calculer et afficher le temps par coup

L’étape la plus simple de cette partie : on divise avec l’opérateur / le nombre de secondes du chronomètre par le nombre de coups stockés dans la variable $i.

$stopwatch.Elapsed.TotalSeconds / $i

Correction

Voir le script complet

Commentaires