了解运行代码内时间计数器和外部代码时间计数器之间的区别

And*_*dry 3 .net powershell performance time performancecounter

好.这个qiestion的标题不容易解码,但让我解释一下.

为了建立一个共同点,我将提供一些详细信息,但这个问题适用于所有可能的上下文,语言和平台.

平台:.NET Framework 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 *)
Run Code Online (Sandbox Code Playgroud)

好!我有时间,我很开心.

现在我想衡量这个时间,但是从外面评估它.因此,请考虑运行该文件但同时计算时间的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";
Run Code Online (Sandbox Code Playgroud)

好.我的问题是:正如您所看到的,我们有两种不同类型的评估:代码内和代码外.我认为那些时代是不同的!因为out-code计时器会评估一些不与我需要评估的程序竞争的指令.例如上下文切换等等...在out-code计时器中,如果cpu经历了一个上下文切换,我将评估另一个进程在其上下文切片期间完成所需的时间...

是这样吗?我对吗?

Alb*_*nbo 5

嗯,不是很正确.
时间可能略有不同,但差异将是实际加载程序的开销.

两种测量都将测量挂钟时间,包括上下文切换,等待I/O,用户输入等.

如果要测量实际CPU使用率(如TaskManager中的CPU时间列),则需要查看System.Diagnostics.Process您可以访问的类TotalProcessorTime等.

如果您想检查自己的过程,可以找到它的引用Process.GetCurrentProcess().