Classes/Chronometer.ps1
class Chronometer { [hashtable]$FileMap = @{} $Breakpoint = @() [void]AddBreakpoint([string[]]$Path, [int[]]$LineNumber) { if(-not [string]::IsNullOrEmpty($Path)) { foreach($file in (Resolve-Path $Path -ea 0)) { $script = [MonitoredScript]@{Path=$file.Path} $lines = $script.SetScript($file) if($null -ne $LineNumber) { $bpLine = $LineNumber } else { $bpLine = (1..$lines) } $this.fileMap[$file.Path] = $script $breakpointParam = @{ Script = $file Line = $bpLine Action = {[ScriptProfiler]::RecordExecution( $_) } } $this.breakPoint += Set-PSBreakpoint @breakpointParam } } } [void]ClearBreakpoint() { if($null -ne $this.Breakpoint -and $this.Breakpoint.count -gt 0) { Remove-PSBreakpoint -Breakpoint $this.Breakpoint } } [void] AddExecution([hashtable]$Execution) { $script = $Execution.Breakpoint.Script if($this.FileMap.ContainsKey($script)) { # Each script tracks it's own execution times $this.FileMap[$script].AddExecution($Execution) } } [MonitoredScript[]] GetResults() { foreach($node in $this.FileMap.Values) { $node.PostProcessing() } return $this.FileMap.Values } } |