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
tatus "Running"
,我们就在一个空while
循环内旋转。完成此操作后,我们Get-Job
将为所有现有作业拉出对象Receive-Job
,将将与STDOUT等效的对象(即,它们输出的内容)-join
通过+
管道传递给对象,并将结果与一起通过管道传递给iex
(Invoke-Expression
和相似eval
)。这将输出结果睡眠时间和开销。
最后一行是相似的,它得到一个新日期,减去原始日期戳$d
,得到.Ticks
,然后除以1e7
输出总执行时间。
NB
好的,所以这有点不明智。显然,在第一次执行时,PowerShell需要从磁盘加载一堆.NET程序集以执行各种线程操作,因为它们没有使用默认的shell配置文件加载。由于程序集已经在内存中,因此后续执行可以正常工作。如果您将Shell窗口闲置足够长的时间,则将获得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>