06_built-in-measure-script-demo.ps1


if ($PSVersionTable.PSVersion.Major -notin (5,7)) { 
    throw "This module only supports PowerShell 5 and 7, but this is $($PSVersionTable.PSVersion)."
}

if (5 -eq $PSVersionTable.PSVersion.Major) { 
    throw "will get to 5 later"
}


[string] $psVersion = $PSVersionTable.PSVersion
$isCustomBuild = '7.2.0-nohwnd' -eq $psVersion
if ($isCustomBuild) { 
    Write-Host "We are in custom PowerShell 7 build. Running in process."
}
else {
    Write-Host "We are in standard PowerShell 7. The script will run in a new process, using the current user profile."
}

if (-not $isCustomBuild) {
    throw "Can't run in new process yet. Start '$PSScriptRoot/pwsh7-nohwnd/pwsh.exe'."
}

$ErrorActionPreference = 'Stop'
Get-Module PSProfiler2 | Remove-Module

# PSProfiler PR from Ilya - https://github.com/PowerShell/PowerShell/pull/13673
# will be in some 7.1.x, version hopefully, but only from that forward

Import-Module $PSScriptRoot/PSProfiler2.psm1


#$traceCore = Measure-Script { & "$psscriptroot/scripts/hello.ps1"}
#Write-Host $traceCore[0].GetType()
$traceCore = Measure-Script { & "C:\p\pester\test.ps1" -skipp } 
Write-Host -ForegroundColor Blue "Got $($traceCore.Count) trace events. Normalizing."

Import-Module C:\p\profiler\src\csharp\Profiler\bin\Debug\net452\Profiler.dll

$index = 0
$trace = $(foreach ($t in $traceCore) { 
    $r = [Profiler.ProfileEventRecord]::new()
    $e = [Profiler.ScriptExtentEventData]::new()
    $e.File =  $t.Extent.File
    $e.StartLineNumber = $t.Extent.StartLineNumber
    $e.StartColumnNumber = $t.Extent.StartColumnNumber
    $e.EndLineNumber = $t.Extent.EndLineNumber
    $e.EndColumnNumber = $t.Extent.EndColumnNumber
    $e.Text = $t.Extent.Text
    $e.StartOffset = $t.Extent.StartOffset
    $e.EndOffset = $t.Extent.EndOffset
    $r.Extent = $e
    $r.StartTime = $t.StartTime
    $r.SelfDuration = $t.SelfDuration
    $r.Index = $index

    $r

    $index++
})

$traceCore = $null


if (-not $trace) { 
    throw "Trace is null something is wrong."
}

Write-Host -ForegroundColor Blue "Trace is done. Processing it via Get-Profile"
$profiles = Get-Profile -Trace $trace # -Path $hello
Write-Host -ForegroundColor Blue "Get-Profile is done."

# but how do we know what is slow? Well it's simple:
$profiles.Top10 |
    Format-Table -Property Percent, HitCount, SelfDuration, Average, Name, Line, Text
# exit
break 


$profiles.Files | Select-Object -Property Path
# hello.ps1
$profiles.Files[2].Profile | Format-Table -Property Line, SelfDuration, HitCount, Text


break 

# but how do we know what is slow? Well it's simple:
$profiles.Top10 |
    Format-Table -Property Percent, HitCount, SelfDuration, Average, Line, Text, CommandHits