Я пишу простой скрипт на Windows PowerShell для оценки производительности исполняемых файлов.
Важной гипотезой является следующее: у меня есть исполняемый файл, это может быть приложение, написанное на любом возможном языке (.net, а не Viual-Prolog, C ++, C, все, что может быть скомпилировано как .exe
файл). Я хочу профилировать это, получая времена выполнения.
Я сделал это:
Function Time-It {
Param ([string]$ProgramPath, [string]$Arguments)
$Watch = New-Object System.Diagnostics.Stopwatch
$NsecPerTick = (1000 * 1000 * 1000) / [System.Diagnostics.Stopwatch]::Frequency
Write-Output "Stopwatch created! NSecPerTick = $NsecPerTick"
$Watch.Start() # Starts the timer
[System.Diagnostics.Process]::Start($ProgramPath, $Arguments)
$Watch.Stop() # Stops the timer
# Collectiong timings
$Ticks = $Watch.ElapsedTicks
$NSecs = $Watch.ElapsedTicks * $NsecPerTick
Write-Output "Program executed: time is: $Nsecs ns ($Ticks ticks)"
}
Эта функция использует секундомер.
Итак, functoin принимает путь к программе, секундомер запускается, программа запускается, а секундомер останавливается. Проблема: System.Diagnostics.Process.Start
является асинхронным, и следующая инструкция (просмотр остановлен) не выполняется, когда приложение завершается. Новый процесс создан ...
Мне нужно остановить таймер после завершения программы.
Я думал о классе Process
, так как в нем была некоторая информация о времени выполнения ... не повезло ...
Как это решить?