functions/perfcounters.ps1

$script:perfstack = @()
$fullperfnames = $false


function measure-function([string] $__name, [scriptblock] $__command) {
    $__result = $null
    $__cmd = {
        $__result = Invoke-Command $__command
    }
    if ($script:perfstack -eq $null) {
        $script:perfstack = @() 
    }    
    $__isrecursion = $__name -in $script:perfstack
    $script:perfstack += "$__name"
    try {
        $__r = Measure-Command $__cmd
    
        if ($global:perfcounters -eq $null) {
            $global:perfcounters = @{}
        }
        if ($fullperfnames) {
            $__key = [string]::Join(">",$script:perfstack)
        } else {
            $__key = $__name
        }
        if ($global:perfcounters.ContainsKey($__key)) {
            if (!$__isrecursion) {
                $global:perfcounters[$__key].elapsed += $__r
            }
            $global:perfcounters[$__key].count++
        } else {
            $__props = [ordered]@{ name = "$__key"; elapsed = $__r; count = 1 } 
            $global:perfcounters[$__key] = new-object -type "pscustomobject" -property $__props  
        }
    
        if ($__result -ne $null) {
            return $__result
        }
    } finally {
        $script:perfstack = $script:perfstack | select -First ($script:perfstack.Length - 1)
    }
}

<#
measure-function "test" {
    measure-function "test1" {
        write-host "hello"
    }
 }

$global:perfcounters | format-table -AutoSize -Wrap | out-string | write-host
      #>