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"
, мы вращаемся внутри пустой while
петли. Как только это будет сделано, мы будем Get-Job
извлекать объекты для всех существующих заданий, направлять те, в Receive-Job
которые будет извлекать эквивалент STDOUT (то есть то, что они выводят), -join
результаты вместе с ними +
и направлять iex
( Invoke-Expression
и аналогично eval
). Это выведет итоговое время ожидания плюс накладные расходы.
Последняя строка похожа в том, что она получает новую дату, вычитает исходную отметку даты $d
, получает .Ticks
и делит 1e7
для вывода общего времени выполнения.
NB
Хорошо, так что это немного изгиба правил. По-видимому, при первом выполнении PowerShell необходимо загрузить несколько сборок .NET с диска для различных операций с потоками, поскольку они не загружены с профилем оболочки по умолчанию. Последующие исполнения, поскольку сборки уже находятся в памяти, работают нормально. Если вы оставите окно оболочки в бездействии достаточно долго, вы получите встроенную сборку мусора PowerShell и разгрузите все эти сборки, в результате чего следующее выполнение займет много времени, так как он перезагружает их. Я не уверен, что можно обойти это.
Вы можете увидеть это во время выполнения в следующих запусках. Я запустил новую оболочку, перешел к своему каталогу по гольфу и выполнил сценарий. Первый запуск был ужасным, но второй (выполненный немедленно) работал нормально. Затем я оставил оболочку на несколько минут бездействующей, чтобы позволить сборке мусора, и затем этот цикл снова стал длительным, но последующие циклы снова работают нормально.
Пример работает
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>