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)
##
##############################################################################
<#
.SYNOPSIS
Measures the average time of a command, accounting for natural variability by
automatically ignoring the top and bottom 10%.
.EXAMPLE
PS > Measure-CommandPerformance.ps1 { Start-Sleep -m 300 }
Count : 30
Average : 312.10155
(...)
#>
param
(
## The command to measure
[Scriptblock]
$Scriptblock
,
## The number of times to measure the command's performance
[int]
$Iterations
=
30
)
Set-StrictMode
-Version
3
## 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
|
Sort
TotalMilliseconds
|
Select
-Skip
$buffer
-First
$iterations
## Show the average
$middleResults
|
Measure-Object
-Average
TotalMilliseconds
For more information about the Measure-Command
cmdlet, type Get-
Help
Measure-Command
.
Recipe 3.8, “Work with .NET Objects”