Использование WIndows PowerShell 1.0 или 2.0 для оценки производительности исполняемых файлов - PullRequest
5 голосов
/ 05 марта 2011

Я пишу простой скрипт на 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, так как в нем была некоторая информация о времени выполнения ... не повезло ...

Как это решить?

Ответы [ 2 ]

6 голосов
/ 05 марта 2011

Вы можете использовать Process.WaitForExit()

$proc = new-object "System.Diagnostics.Process"
$proc.StartInfo.FileName = "notepad.exe"
$proc.StartInfo.UseShellExecute = $false
$proc.Start()
$proc.WaitForExit()
2 голосов
/ 05 марта 2011

Вот ответ kprobst в сочетании с Measure-Command CmdLet для полного решения:

$proc = new-object "System.Diagnostics.Process"
$proc.StartInfo.FileName = "notepad.exe"
$proc.StartInfo.UseShellExecute = $false
$timeSpan = (MeasureCommand { 
                                $proc.Start()
                                $proc.WaitForExit()
                            }
            );
"Program executed: Time is {0} seconds" -f $timeSpan.TotalSeconds;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...