2011-03-04 19 views
5

Estoy escribiendo un script simple en Windows PowerShell para evaluar el rendimiento de los archivos ejecutables.Uso de WIndows PowerShell 1.0 o 2.0 para evaluar el rendimiento de los archivos ejecutables

La hipótesis más importante es la siguiente: Tengo un archivo ejecutable, puede ser una aplicación escrita en cualquier idioma posible (.net y no, Viual-Prolog, C++, C, todo lo que se puede compilar como un archivo .exe) Quiero perfilarlo para obtener tiempos de ejecución.

lo hice:

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)" 
} 

Esta función utiliza cronómetro. Bueno, el functoin acepta una ruta de programa, se inicia el cronómetro, se ejecuta el programa y luego se detiene el cronómetro. Problema: el System.Diagnostics.Process.Start es asincrónico y la siguiente instrucción (reloj parado) no se ejecuta cuando la aplicación finaliza. Se crea un nuevo proceso ...

Necesito detener el temporizador una vez que finaliza el programa.

pensé en la clase Process, thicking se llevó a cabo algo de información respecto a los tiempos de ejecución ... no suerte ...

cómo solucionar esto?

Respuesta

6

Puede utilizar Process.WaitForExit()

$proc = new-object "System.Diagnostics.Process" 
$proc.StartInfo.FileName = "notepad.exe" 
$proc.StartInfo.UseShellExecute = $false 
$proc.Start() 
$proc.WaitForExit() 
+0

Pero no es estático ... debería crear un objeto de proceso, pero realmente no entiendo cómo configurar la ruta ejecutable ... – Andry

+0

'$ proc = new-object" System.Diagnostics.Process "' y luego simplemente establezca las propiedades. Puedes seguir la documentación de .NET, las clases funcionan igual, obviamente. – kprobst

+0

@Andry - He añadido una muestra. – kprobst

2

Aquí es kprobst's answer, combinado con la Measure-Command cmdlet, para una solución completa:

$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; 
Cuestiones relacionadas