PowerShell v4、144バイト
$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に等しいGet-Date、として既存のジョブ履歴をクリアしますGet-Job | Remove-Job。次にループし1..20|%{...}、各反復がジョブのStart-Jobスクリプトブロック{$x=date;sleep 3;((date)-$x).ticks/1e7}を渡して実行します(各ジョブがそのスクリプトブロックを実行することを意味します)。>$null返されるフィードバック(ジョブ名、ステータスなど)を抑制するために、出力をパイプします。
スクリプトブロックセット$xにGet-Date、その後、Start-Sleep用3秒、その後、新しい取りGet-Date、読書を減算し$x、取得.Ticks、およびによって除算1e7(正確に)秒を取得します。
メインスレッドに-S戻り"Running"、ジョブがtatus である限り、空のwhileループ内でスピンします。それが完了したらGet-Job、既存のすべてのジョブのオブジェクトをReceive-Jobプルアップし、STDOUTに相当するもの(つまり、出力するもの)をプルアップするオブジェクト-join、結果をとともに+パイプし、パイプしますiex(Invoke-Expressionそして同様にeval)。これにより、結果のスリープ時間とオーバーヘッドが出力されます。
最後の行も同様です。新しい日付を取得し、元の日付スタンプを減算し$d、を取得して.Ticks、除算し1e7て合計実行時間を出力します。
NB
OK、だからこれはルールのややこしいです。PowerShellは、最初の実行時に、デフォルトのシェルプロファイルではロードされないため、さまざまなスレッド操作のためにディスクから多数の.NETアセンブリをロードする必要があるようです。アセンブリは既にメモリ内にあるため、その後の実行は正常に機能します。シェルウィンドウを十分長い間アイドル状態のままにすると、PowerShellの組み込みのガベージコレクションが取得されてアンロードされます、それらのすべてのアセンブリがれるため、次の実行で再ロードに時間がかかります。これを回避する方法がわかりません。
これは、以下の実行の実行時間で確認できます。新鮮なシェルを起動し、ゴルフディレクトリに移動して、スクリプトを実行しました。最初の実行は恐ろしいものでしたが、2番目の実行(すぐに実行)は正常に機能しました。その後、シェルを数分間アイドル状態にして、ガベージコレクションを実行します。その実行は再び長くなりますが、その後の実行は再び正常に機能します。
実行例
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>