PowerShell v4, 144 octets
$d=date;gjb|rjb
1..20|%{sajb{$x=date;sleep 3;((date)-$x).Ticks/1e7}>$null}
while(gjb -s "Running"){}(gjb|rcjb)-join'+'|iex
((date)-$d).Ticks/1e7
Définit $d
égal à Get-Date
, et efface tous les historiques de travaux existants avec Get-Job | Remove-Job
. Nous effectuons ensuite une boucle 1..20|%{...}
et chaque exécution exécute en lui Start-Job
passant le bloc de script {$x=date;sleep 3;((date)-$x).ticks/1e7}
pour le travail (ce qui signifie que chaque travail exécutera ce bloc de script). Nous dirigeons cette sortie vers >$null
afin de supprimer le retour (c.-à-d. Nom du travail, statut, etc.) qui est renvoyé.
Le bloc de script se met $x
à Get-Date
, puis Start-Sleep
pendant des 3
secondes, puis effectue une nouvelle Get-Date
lecture, soustrait $x
, obtient le .Ticks
, et divise par 1e7
pour obtenir les secondes (avec précision).
De retour dans le thread principal, tant que tout travail est toujours -S
actif "Running"
, nous tournons à l' intérieur d'une while
boucle vide . Une fois que cela est fait, nous devons Get-Job
extraire des objets pour tous les travaux existants, diriger ceux vers Receive-Job
lesquels sera extrait l'équivalent de STDOUT (c.-à-d. Ce qu'ils produisent), -join
les résultats ainsi que +
, et diriger vers iex
( Invoke-Expression
et similaire eval
). Cela produira le temps de sommeil résultant plus les frais généraux.
La dernière ligne est similaire, en ce sens qu'elle obtient une nouvelle date, soustrait l'estampille de date d'origine $d
, récupère le .Ticks
et divise par 1e7
pour afficher le temps total d'exécution.
NB
OK, donc c'est un peu flou des règles. Apparemment, lors de la première exécution, PowerShell doit charger un groupe d'assemblys .NET à partir du disque pour les différentes opérations de thread, car ils ne sont pas chargés avec le profil de shell par défaut. Les exécutions ultérieures , car les assemblys sont déjà en mémoire, fonctionnent correctement. Si vous laissez la fenêtre du shell inactive suffisamment longtemps, vous obtiendrez la récupération de place intégrée de PowerShell et déchargerez tous ces assemblages, ce qui retardera l'exécution de la prochaine exécution. Je ne suis pas sûr d'un moyen de contourner cela.
Vous pouvez le voir dans les temps d'exécution dans les exécutions ci-dessous. J'ai commencé un nouveau shell, j'ai navigué dans mon répertoire de golf et exécuté le script. La première manche a été horrible, mais la seconde (exécutée immédiatement) a bien fonctionné. J'ai ensuite laissé le shell inactif pendant quelques minutes pour permettre à la récupération de place de se faire, puis l'exécution est à nouveau longue, mais les exécutions suivantes fonctionnent à nouveau correctement.
Exemple fonctionne
Windows PowerShell
Copyright (C) 2014 Microsoft Corporation. All rights reserved.
PS H:\> c:
PS C:\> cd C:\Tools\Scripts\golfing
PS C:\Tools\Scripts\golfing> .\wait-a-minute.ps1
63.232359
67.8403415
PS C:\Tools\Scripts\golfing> .\wait-a-minute.ps1
61.0809705
8.8991164
PS C:\Tools\Scripts\golfing> .\wait-a-minute.ps1
62.5791712
67.3228933
PS C:\Tools\Scripts\golfing> .\wait-a-minute.ps1
61.1303589
8.5939405
PS C:\Tools\Scripts\golfing> .\wait-a-minute.ps1
61.3210352
8.6386886
PS C:\Tools\Scripts\golfing>