2011-11-11 11 views
8

इससे पहले मैं SO पर एक महान answer पढ़ रहा था और मुझे आश्चर्य हुआ कि इसे अभी तक PowerShell में क्यों नकल नहीं किया गया है।पावरशेल में यूनिक्स टाइम कमांड के बराबर?

यूनिक्स/लिनक्स में, हम time कमांड को सरल बेंचमार्क टूल के रूप में उपयोग कर सकते हैं।

$ Measure-Command {java post_incr} 

Days    : 0 
Hours    : 0 
Minutes   : 0 
Seconds   : 1 
Milliseconds  : 18 
Ticks    : 10188003 
TotalDays   : 1.17916701388889E-05 
TotalHours  : 0.000283000083333333 
TotalMinutes  : 0.016980005 
TotalSeconds  : 1.0188003 
TotalMilliseconds : 1018.8003 

लेकिन इस time है, जो रिपोर्ट असली, उपयोगकर्ता और सिस (तीन के बीच का अंतर देखें के समान नहीं है:

$ time ./script1.sh 

real 0m1.005s 
user 0m0.000s 
sys  0m0.008s 

powershell में, हम measure-command इसी तरह उपयोग कर सकते हैं लिंक एसओ उत्तर।)

यह (time) स्पष्ट रूप से इतना उपयोगी छोटा उपकरण है। क्या इस कार्यक्षमता के लिए कोई उपयोगकर्ता लिखा cmdlets है या यह पहले से ही V3 में है या भविष्य की रिलीज के लिए योजनाबद्ध है?

उत्तर

2

GetProcessTimes फ़ंक्शन का उपयोग करके एक सी प्रोग्राम लिखें, आप इसके दस्तावेज़ को http://msdn.microsoft.com/en-us/library/ms683223%28VS.85%29.aspx में ढूंढ सकते हैं।

"विंडोज सिस्टम प्रोग्रामिंग" पुस्तक के उदाहरणों में एक प्रोग्राम आता है जो उस फ़ंक्शन का उपयोग ठीक उसी चीज़ को पुनर्प्राप्त करने के लिए करता है जो आपको चाहिए (विलुप्त, कर्नेल, उपयोगकर्ता समय)। कार्यक्रम "timep.exe" पर कॉल किया गया है और यह zx उदाहरण संग्रह के अंदर runX उपनिर्देशिकाओं (एक्स संकलन में उपयोग किए गए विजुअल स्टूडियो के संस्करण से आता है) में पाया जा सकता है। यहां लेखक पृष्ठ है जहां से आप उस संग्रह को http://www.jmhartsoftware.com/ डाउनलोड कर सकते हैं, बेशक स्रोत कोड भी है ताकि आप देख सकें कि timep.exe कैसे काम करता है।

1

मैं इस्तेमाल किया दोनों System.Diagnostics.Process और GetProcessTimes द्वारा प्रदान की बार time के लिए क्रियान्वयन साथ आने के लिए: के रूप में वास्तविक समय (sleep 10 के लिए) के रूप में के बारे में 11 सेकंड बाहर आता है

[email protected]' 

using System; 
using System.Diagnostics; 
using System.Runtime.InteropServices; 

public class Timer 
    { 
     [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
     public static extern bool GetProcessTimes(IntPtr handle, out long creation, out long exit, out long kernel, 
                out long user); 

     public static void Time(string file,string args) 
     { 
      long user,kernel,exit,creation; 
      Process proc = null; 
      proc = Process.Start(file,args); 
      proc.WaitForExit(); 
      GetProcessTimes(proc.Handle, out creation, out exit, out kernel, out user); 
      long real = exit - creation; 
      Console.WriteLine("real {0}\nuser {1}\nsys {2}", real/10000000.0, user/10000000.0,kernel/10000000.0); 
     } 
    } 
'@ 

Add-Type -TypeDefinition $source -Language CSharpVersion3 

function time ($scriptblock) { 

    $file = "powershell"; 
    $args = $scriptblock; 

    $startInfo = new-object Diagnostics.ProcessStartInfo; 
    $startInfo.FileName = $file; 
    $startInfo.Arguments = $args; 
    $startInfo.CreateNoWindow = $true; 
    $startInfo.UseShellExecute = $false; 
    $startInfo.RedirectStandardOutput = $true; 
    $process = [Diagnostics.Process]::Start($startInfo); 
    $process.WaitForExit(); 
    write-host $process.StandardOutput.ReadToEnd(); 
    write-host real: ($process.ExitTime - $process.StartTime) 
    write-host user: $process.UserProcessorTime; 
    write-host sys: $process.PrivilegedProcessorTime; 
    write-host using GetProcessTimes 
    [Timer]::Time($file,$args) 
} 

time {sleep 10} 

यह वास्तव में सही नहीं है चूंकि मैं एक पावरहेल प्रक्रिया बना रहा हूं और उसमें कमांड चला रहा हूं। मैं देखूंगा कि क्या मैं इसके लिए एक cmdlet या कुछ कार्यान्वित कर सकता हूं।

+1

मैं विंडोज पावरहेल का उपयोग करने के लिए वास्तव में नया हूं, क्या आप समझा सकते हैं कि मुझे आपके 'समय' कार्यान्वयन का उपयोग करने के लिए क्या करना है? – Amndeep7

0

जिस प्रक्रिया को आप मापने की कोशिश कर रहे हैं वह पृष्ठभूमि में भी चल रहा है और चल रहा है जो माप-आदेश माप को छोटा करने के लिए मापता है। 0 -के साथ स्टार्ट-प्रोसेस का उपयोग कर सकते हैं- पूर्णकालिक माप प्राप्त करने के लिए पैरामीटर देखें। यहां एक उदाहरण दिया गया है जो दिखाता है कि निष्क्रिय कनेक्शन को बंद करने के लिए यह stackoverflow.com 34 सेकंड लेता है:

$program = 'telnet' 
$ArgumentList = 'stackoverflow.com 80' 
$WorkingDirectory = 'c:\' 
Measure-Command { 
    $p = Start-Process -FilePath $program -ArgumentList $ArgumentList -Wait -PassThru -WorkingDirectory $WorkingDirectory -NoNewWindow; 
    Write-Host $p.ExitCode; 
} 


#Output: 
0 


Days    : 0 
Hours    : 0 
Minutes   : 0 
Seconds   : 34 
Milliseconds  : 37 
Ticks    : 340370635 
TotalDays   : 0.000393947494212963 
TotalHours  : 0.00945473986111111 
TotalMinutes  : 0.567284391666667 
TotalSeconds  : 34.0370635 
TotalMilliseconds : 34037.0635 
1

चेतावनी, PowerShell आगे।

function time { $Command = "$args"; Measure-Command { Invoke-Expression $Command 2>&1 | out-default} } 

और यदि आप इसे उत्पादन कुछ भी नहीं करना चाहते हैं, बस बाहर अशक्त के साथ बदलें:

function timequiet { $Command = "$args"; Measure-Command { Invoke-Expression $Command 2>&1 | out-null} } 

आप इस तरह इसका इस्तेमाल:

कुछ कॉफी मुझे इस के साथ आने में मदद की

PS C:\> time sleep 5 


Days    : 0 
Hours    : 0 
Minutes   : 0 
Seconds   : 4 
Milliseconds  : 990 
Ticks    : 49906722 
TotalDays   : 5,77624097222222E-05 
TotalHours  : 0,00138629783333333 
TotalMinutes  : 0,08317787 
TotalSeconds  : 4,9906722 
TotalMilliseconds : 4990,6722 



PS C:\> 
संबंधित मुद्दे