2011-03-04 54 views
5

爲了評估可執行文件的性能,我正在Windows PowerShell上編寫一個簡單的腳本。使用WIndows PowerShell 1.0或2.0來評估可執行文件的性能

重要的假設如下:我有一個可執行文件,它可以是用任何可能的語言編寫的應用程序(.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)" 
} 

此功能使用秒錶。 那麼,功能接受程序路徑,秒錶啓動,程序運行和秒錶停止。問題:System.Diagnostics.Process.Start是異步的,當應用程序結束時,下一條指令(watch stopped)不會被執行。一個新的過程被創建...

我需要停止計時器,一旦程序結束。

我想到了Process類,增厚其持有的關於執行時間...不幸運一些信息...

如何解決這個問題?

回答

6

您可以使用Process.WaitForExit()

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

但它不是靜態的......我應該創建一個Process對象,但不知道如何設置可執行文件路徑... – Andry 2011-03-04 23:32:39

+0

'$ proc = new-object「System.Diagnostics.Process」'然後設置屬性。你可以關注.NET文檔,顯然,這些類的工作原理是一樣的。 – kprobst 2011-03-04 23:42:28

+0

@Andry - 我添加了一個樣本。 – kprobst 2011-03-04 23:48:09

2

這裏的kprobst's answer,與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;