PowerShell v4, 144 byte
$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
Imposta $d
uguale a Get-Date
e cancella tutte le storie di lavoro esistenti con Get-Job | Remove-Job
. Quindi eseguiamo il loop 1..20|%{...}
e ogni iterazione viene eseguita Start-Job
passando il blocco di script {$x=date;sleep 3;((date)-$x).ticks/1e7}
per il processo (il che significa che ogni processo eseguirà quel blocco di script). Effettuiamo il piping dell'output per >$null
sopprimere il feedback (ad esempio, nome lavoro, stato, ecc.) Che viene restituito.
Il blocco di script viene impostato $x
su Get-Date
, quindi Start-Sleep
per 3
secondi, quindi richiede una nuova Get-Date
lettura, sottrae $x
, ottiene il .Ticks
e si divide 1e7
per ottenere i secondi (con precisione).
Di nuovo nel thread principale, fintanto che qualsiasi lavoro è ancora -S
tatus "Running"
, giriamo all'interno di un while
loop vuoto . Una volta fatto ciò, Get-Job
tiriamo su gli oggetti per tutti i lavori esistenti, reindirizziamo quelli a Receive-Job
cui tirerà su l'equivalente di STDOUT (cioè, ciò che producono), -join
i risultati insieme +
e lo colleghiamo a iex
( Invoke-Expression
e simili a eval
). Questo produrrà il tempo di sonno risultante più spese generali.
La riga finale è simile, in quanto ottiene una nuova data, sottrae l'indicatore della data originale $d
, ottiene il .Ticks
simbolo e si divide 1e7
per generare il tempo di esecuzione totale.
NB
OK, quindi questo è un po ' flessibile delle regole. Apparentemente alla prima esecuzione, PowerShell deve caricare un sacco di assembly .NET dal disco per le varie operazioni del thread poiché non sono caricati con il profilo shell predefinito. Le esecuzioni successive , poiché gli assembly sono già in memoria, funzionano correttamente. Se si lascia la finestra della shell inattiva abbastanza a lungo, si otterrà la garbage collection integrata di PowerShell per scaricare e scaricare tutti quegli assembly, facendo sì che l'esecuzione successiva richieda molto tempo mentre li ricarica. Non sono sicuro di un modo per aggirare questo.
Puoi vederlo nei tempi di esecuzione nelle esecuzioni sottostanti. Ho avviato una nuova shell, ho navigato nella mia directory di golf ed eseguito lo script. La prima manche è stata orrenda, ma la seconda (eseguita immediatamente) ha funzionato bene. Ho quindi lasciato la shell inattiva per alcuni minuti per far passare la garbage collection, e poi quella corsa è di nuovo lunga, ma le successive corse funzionano di nuovo bene.
L'esempio funziona
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>