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>