निम्नलिखित से परिपूर्ण है। लेकिन यह सबसे नज़दीक है जो मैं यूनिक्स time
व्यवहार को अनुकरण करने के लिए आ सकता हूं। मुझे यकीन है कि इसे बहुत सुधार किया जा सकता है।
असल में मैं एक cmdlet बना रहा हूं जो एक स्क्रिप्ट ब्लॉक प्राप्त करता है, एक प्रक्रिया उत्पन्न करता है और कर्नेल, उपयोगकर्ता और समाप्त समय प्राप्त करने के लिए GetProcessTimes
का उपयोग करता है।
एक बार cmdlet भरी हुई है, बस के साथ
Measure-Time -Command {your-command} [-silent]
-Silent
स्विच आदेश से उत्पन्न कोई उत्पादन का मतलब यह आह्वान (अर्थात, आप केवल समय के उपायों में रुचि रखते हैं)
तो के लिए उदाहरण:
Measure-Time -Command {Get-Process;sleep -Seconds 5} -Silent
उत्पादन उत्पन्न:
+०१२३५१६४१०६
Kernel time : 0.6084039
User time : 0.6864044
Elapsed : 00:00:06.6144000
यहाँ cmdlet है:
Add-Type -TypeDefinition @"
using System;
using System.Runtime.InteropServices;
public class ProcessTime
{
[DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
public static extern bool GetProcessTimes(IntPtr handle,
out IntPtr creation,
out IntPtr exit,
out IntPtr kernel,
out IntPtr user);
}
"@
function Measure-Time
{
[CmdletBinding()]
param ([scriptblock] $Command,
[switch] $Silent = $false
)
begin
{
$creation = 0
$exit = 0
$kernel = 0
$user = 0
$psi = new-object diagnostics.ProcessStartInfo
$psi.CreateNoWindow = $true
$psi.RedirectStandardOutput = $true
$psi.FileName = "powershell.exe"
$psi.Arguments = "-command $Command"
$psi.UseShellExecute = $false
}
process
{
$proc = [diagnostics.process]::start($psi)
$buffer = $proc.StandardOutput.ReadToEnd()
if (!$Silent)
{
Write-Output $buffer
}
$proc.WaitForExit()
}
end
{
$ret = [ProcessTime]::GetProcessTimes($proc.handle,
[ref]$creation,
[ref]$exit,
[ref]$kernel,
[ref]$user
)
$kernelTime = [long]$kernel/10000000.0
$userTime = [long]$user/10000000.0
$elapsed = [datetime]::FromFileTime($exit) - [datetime]::FromFileTime($creation)
Write-Output "Kernel time : $kernelTime"
Write-Output "User time : $userTime"
Write-Output "Elapsed : $elapsed"
}
}
स्रोत
2014-12-03 08:50:19
मुझे लगता है कि इस सवाल का जवाब से अधिक देखा लेकिन है कि क्या करने के लिए के रूप में वहाँ एक रास्ता सिर्फ वास्तविक समय के लिए विरोध के रूप में सिस्टम और उपयोगकर्ता समय की अलग रीडिंग मिल गया था उत्सुक था। – Code
पावरशेल में आप 'माप-कमान' में पाइप कर सकते हैं लेकिन मुझे अलग-अलग समय के टूटने के बारे में पता नहीं है। 'एलएस | उपाय-कमांड ' – Matt
विंडोज़ में, उपयोगकर्ता समय और कर्नेल समय के बीच अंतर करने का शायद ही कभी कारण है। यदि आप ऐसा करना चाहते हैं तो आपको शायद अपना कोड लिखना होगा। –