我刚刚发布了一个新模块 Powershell Gallery. 。 打电话给这个 天文计 因为它有能力通过行脚本执行时间跟踪行。如果你用纠缠在一起,它也具有在视觉上显示代码覆盖的有趣副作用。

 计时器样本

这是如何运作的?

这个想法受到佩斯特能够为您提供测试的代码的能力启发。我仔细看了看,他们做了聪明的事。它们为指定脚本中的每一行设置了一个断点。然后在他们运行所有测试之后,他们走了断点,看看有多少人被击中。

我决定做同样的事情并测量执行之间的时间Δ。我能够相当迅速地摧毁一个工作原型,然后在接下来的几天中花费抛光成可用的东西。

因为我按行执行时间的线路,我还跟踪了每行都运行了多少次。还有其他统计数据,我收集平均值,最小和最大时间。

要求和如何安装

电源外壳 5.0.

此模块确实需要PowerShell 5.0。我在这个模块中使用类,这就是为什么需要5.0。

安装模块时计时器

我正在将此发布到PowerShell Gallery,以便您可以从那里快速安装它。

 安装模块时计时器 

源也被公布为 //github.com/KevinMarquette/Chronometer.

格式量词

理解它的最简单方法是查看结果报告。然后我将循环回来向您展示如何运行它。

 天文表报告

我们可以从本报告中看到一些事情。源文件的每一行都表示。左侧的数字显示总执行,执行次数,然后是平均执行时间。颜色显示未执行的线条的灰色。

如果指定多个文件,则它将为每个文件生成一个报告。

丰富的物体

MonitoredScript.

While that report is fun to look at, we do have objects to work with. The get-chronometer. command gives us a list of [MonitoredScript] objects. For each file specified, we get the execution time.

Path          : C:\workspace\PSGraph\PSGraph\Public\Set-NodeFormatScript.ps1
Line          : {[0003ms,0008,0000ms]  function Set-NodeFormatScript, [0000ms,...}
ExecutionTime : 30
LinesOfCode   : 21

此执行时间包括它在其他呼叫上等待的时间。我指出了这一点,因为如果你有一个慢慢函数,那么慢化将反映在所有调用脚本中。

scriptline.

The [MonitoredScript] object has a Line property that contains all the [ScriptLine] objects. Here is a sample from one of those objects.

Milliseconds : 1
HitCount     : 8
Min          : 0
Max          : 1
Average      : 0.125
LineNumber   : 19
Path         : C:\workspace\PSGraph\PSGraph\Public\Set-NodeFormatScript.ps1
Text         :     $Script:CustomFormat = $ScriptBlock

I only show a subset of this in the report, but you have access to it all. It is actually the ToString() function on this line that produces the report text.

[0001ms,0008,0000ms]      $Script:CustomFormat = $ScriptBlock

get-chronometer.

所以现在我们知道我们能做什么,这就是你的Chronometer脚本。

$Chronometer = @{
    Path = '.\myscript.ps1'
    Script = {. .\myscript.ps1}
}
Get-Chronometer @Chronometer | Format-Chronometer

这将监视指定路径中的文件,然后在脚本中执行命令。在这个例子中,我只是在运行同一个脚本。

用纠缠

我喜欢用纠缠结合这个,看看代码覆盖范围。

$script = Get-ChildItem C:\workspace\PSGraph\PSGraph -Recurse -Filter *.ps1
$Chronometer = @{
    Path = $script.fullname
    Script = {Invoke-Pester C:\workspace\PSGraph}
}
$results = Get-Chronometer @Chronometer 
$results | Format-Chronometer

这将加载我项目中的每个脚本,然后运行所有测试。完成后,我会看到我的代码覆盖。

有了这一说,纠正码覆盖功能有更好的工作。我正在服用很多捷者没有服用的捷径。他们甚至跟踪子行表达式。

限制和其他细节

The engine doing the work is fairly simple and limited by what the debugger is tracking. You will see it skip some things that mentally you expect it to hit. My best example is is the if(...){...}else{...} command. It will jump into the else block without counting the else block as a command. That is accurate, but just not how we think about it. Same goes for some open and close braces.

监视和跟踪每行执行线确实有一些开销。我试图通过快速收集数据,然后在稍后将其发布到Deltas的处理中,尽量减少开销。

下一步是什么?

这仍然是一项正在进行的工作。我主要试图在此刻抛光用户体验。我希望尽可能易于使用。随意尝试。