
Welcome PowerShell User! This recipe is just one of the hundreds of useful resources contained in the PowerShell Cookbook.
If you own the book already, login here to get free, online, searchable access to the entire book's content.
If not, the Windows PowerShell Cookbook is available at Amazon, or any of your other favourite book retailers. If you want to see what the PowerShell Cookbook has to offer, enjoy this free 90 page e-book sample: "The Windows PowerShell Interactive Shell".
You want to know how long a command takes to execute.
To measure the duration of a command, use the Measure-Command cmdlet:
PS > Measure-Command { Start-Sleep -Milliseconds 337 }
Days : 0
Hours : 0
Minutes : 0
Seconds : 0
Milliseconds : 339
Ticks : 3392297
TotalDays : 3.92626967592593E-06
TotalHours : 9.42304722222222E-05
TotalMinutes : 0.00565382833333333
TotalSeconds : 0.3392297
TotalMilliseconds : 339.2297
In interactive use, it’s common to want to measure the duration of a command. An example of this might be running a performance benchmark on an application you’ve developed. The Measure-Command cmdlet makes this easy to do. Because the command generates rich object-based output, you can use its output for many date-related tasks. See Recipe 3.8 for more information.
If the accuracy of a command measurement is important, general system activity can easily influence the timing of the result. A common technique for improving accuracy is to repeat the measurement many times, ignore the outliers (the top and bottom 10 percent), and then average the remaining results. Example 8-1 implements this technique.
################################################################################## Measure-CommandPerformance#### From PowerShell Cookbook (O'Reilly)## by Lee Holmes (http://www.leeholmes.com/guide)################################################################################<#.SYNOPSISMeasures the average time of a command, accounting for natural variability byautomatically ignoring the top and bottom 10%..EXAMPLEPS > Measure-CommandPerformance.ps1 { Start-Sleep -m 300 }Count : 30Average : 312.10155(...)#>param(## The command to measure[Scriptblock]$Scriptblock,## The number of times to measure the command's performance[int]$Iterations=30)Set-StrictMode-Version3## Figure out how many extra iterations we need to account for the outliers$buffer=[int]($iterations*0.1)$totalIterations=$iterations+(2*$buffer)## Get the results$results=1..$totalIterations|Foreach-Object{Measure-Command$scriptblock}## Sort the results, and skip the outliers$middleResults=$results|SortTotalMilliseconds|Select-Skip$buffer-First$iterations## Show the average$middleResults|Measure-Object-AverageTotalMilliseconds
For more information about the Measure-Command cmdlet, type Get-Help Measure-Command.
Recipe 3.8, “Work with .NET Objects”