PowerShell v4, 144 bytes
$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
Define $d
igual a Get-Date
e limpa todos os históricos de trabalhos existentes Get-Job | Remove-Job
. Em seguida, fazemos um loop 1..20|%{...}
e cada iteração é executada Start-Job
passando o bloco de scripts {$x=date;sleep 3;((date)-$x).ticks/1e7}
para o trabalho (o que significa que cada trabalho executará esse bloco de script). Canalizamos essa saída para >$null
suprimir o feedback (nome do trabalho, status etc.) que é retornado.
O bloco de script define $x
como Get-Date
, então, Start-Sleep
por 3
segundos, em seguida, recebe uma nova Get-Date
leitura, subtrai $x
, obtém o .Ticks
e divide por 1e7
para obter os segundos (com precisão).
De volta à thread principal, desde que qualquer trabalho ainda seja -S
obrigatório "Running"
, giramos dentro de um while
loop vazio . Uma vez feito isso, Get-Job
puxamos objetos para todos os trabalhos existentes, canalizamos aqueles para os Receive-Job
quais o equivalente a STDOUT (ou seja, o que eles produzem), -join
os resultados juntos +
, e canalizamos iex
( Invoke-Expression
e semelhante a eval
). Isso produzirá o tempo de suspensão resultante mais a sobrecarga.
A linha final é semelhante, na medida em que obtém uma nova data, subtrai o carimbo de data original $d
, obtém o .Ticks
e divide por 1e7
para gerar o tempo total de execução.
NB
OK, então isso é um pouco flexível das regras. Aparentemente, na primeira execução, o PowerShell precisa carregar vários assemblies .NET do disco para as várias operações de encadeamento, pois elas não são carregadas com o perfil de shell padrão. Execuções subseqüentes , porque os assemblies já estão na memória, funcionam bem. Se você deixar a janela do shell inativa por tempo suficiente, você fará com que a coleta de lixo interna do PowerShell apareça e descarregue todos esses assemblies, fazendo com que a próxima execução demore muito tempo enquanto ela é carregada novamente. Eu não tenho certeza de uma maneira de contornar isso.
Você pode ver isso nos tempos de execução nas execuções abaixo. Comecei um novo shell, naveguei para o meu diretório de golfe e executei o script. A primeira corrida foi horrenda, mas a segunda (executada imediatamente) funcionou bem. Em seguida, deixei o shell inativo por alguns minutos para permitir a coleta de lixo e, em seguida, essa execução é novamente demorada, mas as execuções subseqüentes novamente funcionam bem.
Execuções de exemplo
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>