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

时间:2011-03-06 11:56:29

标签: .net performance powershell 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 *)

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";

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

是这样吗? 我是对的吗?

2 个答案:

答案 0 :(得分:5)

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

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

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

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

答案 1 :(得分:1)

在Powershell中,您可以通过执行

获取实际使用的cpu时间
  (get-process -ID $PID).cpu

运行命令之前和之后。

话虽如此,它可能是也可能不是衡量脚本性能基准的好指标。编写错误的脚本会花费太多时间等待外部事件(如磁盘I / O或目录查找),这可能表明它使用的CPU时间非常短,但实际上需要很长时间才能完成,实际上会对外部资源造成更多的开销。