2011-03-06 57 views
3

好的。這個qiestion的標題不容易解碼,但讓我解釋一下。瞭解運行內碼時間計數器和外碼時間計數器之間的區別

爲了建立一個共同點,我將提供一些詳細的信息,但這個問題是爲了適用於所有可能的語境,語言和平臺。

平臺:.NET框架4.0 操作系統:Windows(顯然) 語言:F#

我需要運行一個程序和評估所花的時間來執行一些指令。 考慮到有一個主要功能,有你放置時間計數器:

open System.Diagnostics 
let main args = 
    let watch = new Stopwatch() 
    watch.Start() 
    (* Calling functions and executing main body... *) 
    watch.Stop() 
    (* Printing out the evaluated time *) 

OK! 我得到時間,我很高興。

現在我想測量這個時間,但從外部評估它。 因此認爲太運行該文件,但達到時間PowerShell腳本:

$MyProcess = New-Object "System.Diagnostics.Process"; 
$Watch = New-Object "System.Diagnostics.Stopwatch"; 
$MyProcess.StartInfo.FileName = "Myexec"; 
$MyProcess.StartInfo.Arguments = "args"; 
$MyProcess.StartInfo.CreateNoWindow = $true; 
$MyProcess.StartInfo.UseShellExecute = $false; 
$StartingTimer = $Watch.Start(); # Starts the timer 
$StartingProcess = $MyProcess.Start(); 
$WaitingForExit = $MyProcess.WaitForExit(); 
$StoppingTimer = $Watch.Stop(); # Stops the timer 
# Collectiong timings 
$Ticks = $Watch.ElapsedTicks; 
# Returning and printing 
Write-Output "$Ticks"; 

嘛。 我的問題是這樣的: 正如你所看到的,我們有兩種不同類型的評估:in-code和out-code。 我認爲那些時代是不同的!因爲out-code計時器會評估一些不參與我需要評估的程序的指令。例如上下文切換等...... 在外碼計時器中,如果CPU經歷上下文切換,我將評估其他進程在其上下文切片期間完成的時間...

是這樣嗎? 我對不對?

回答

5

呃,不是真的正確。
時間可能稍有不同,但差異將是實際加載程序的開銷。

兩個測量將測量掛鐘時間,包括上下文切換,等待I/O,用戶輸入等

如果要測量實際CPU使用率(如在任務管理器的CPU時間列),你需要在類別System.Diagnostics.Process中尋找您可以訪問TotalProcessorTime等的地方。

如果您想檢查自己的過程,可以使用Process.GetCurrentProcess()找到對它的引用。

1

在PowerShell中,你可以得到由之前和您運行命令後做

(get-process -ID $PID).cpu 

實際使用的CPU時間。

這就是說,它可能是也可能不是一個很好的衡量腳本性能的基準。一個花費太多時間等待外部事件(如磁盤I/O或目錄查找)的寫得很差的腳本可能表明它使用的CPU時間非常短,但實際上需要很長時間才能完成,並且實際上在外部資源上施加了更多的開銷。