2011-11-11 63 views
8

Trước đó tôi đã đọc một số lớn answer trên SO và tôi tự hỏi tại sao nó chưa được mô phỏng trong PowerShell.Tương đương với lệnh thời gian Unix trong PowerShell?

Trong unix/linux, chúng tôi có thể sử dụng lệnh time làm công cụ đo điểm chuẩn đơn giản.

$ time ./script1.sh 

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

Trong PowerShell, chúng ta có thể sử dụng measure-command tương tự:

$ 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 

Nhưng điều này không giống như các time, mà báo cáo thực tế, người dùng và sys (Xem phần chênh lệch giữa ba trong SO trả lời được liên kết.)

Điều này (time) rõ ràng là một công cụ nhỏ hữu ích. Có bất kỳ người dùng nào đã viết lệnh ghép ngắn cho chức năng này hoặc đã có trong phiên bản V3 hoặc được lên kế hoạch cho các bản phát hành trong tương lai không?

Trả lời

2

Viết chương trình C bằng chức năng GetProcessTimes, bạn có thể tìm thấy tài liệu của tài liệu tại: http://msdn.microsoft.com/en-us/library/ms683223%28VS.85%29.aspx.

Trong ví dụ về cuốn sách "Lập trình hệ thống Windows" có chương trình sử dụng chức năng đó để truy xuất chính xác những gì bạn cần (Đã trôi qua, Kernel, Thời gian người dùng). Chương trình này gọi là "timep.exe" và nó có thể được tìm thấy trong thư mục con runX (X xuất phát từ phiên bản Visual Studio được sử dụng trong trình biên dịch) bên trong kho lưu trữ ví dụ nén. Đây là trang tác giả từ nơi bạn có thể tải xuống lưu trữ đó http://www.jmhartsoftware.com/, tất nhiên mã nguồn cũng có sẵn để bạn có thể thấy chính xác cách thức hoạt động của timep.exe.

1

tôi đã sử dụng cả hai lần được cung cấp bởi System.Diagnostics.ProcessGetProcessTimes để đến với một thực hiện cho time:

[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} 

Nó không phải là thực sự hoàn hảo như thời gian thực đi ra như khoảng 11 giây (đối với sleep 10) kể từ khi tôi đang tạo ra một quá trình powershell và chạy lệnh trong đó. Tôi sẽ xem nếu tôi có thể thực hiện một lệnh ghép ngắn hoặc một cái gì đó cho việc này.

+1

Tôi thực sự mới sử dụng Windows Powershell, bạn có thể giải thích những gì tôi cần làm để sử dụng triển khai 'time' của bạn không? – Amndeep7

0

Quá trình bạn đang cố gắng đo cũng có thể là giả mạo và chạy ở chế độ nền làm cho đo lường Đo lường-Lệnh bị cắt ngắn. Bạn có thể sử dụng Quy trình bắt đầu với thông số -Wait để có được phép đo toàn thời gian mà bạn mong đợi. Dưới đây là ví dụ cho thấy rằng phải mất stackoverflow.com 34 giây để đóng kết nối không hoạt động:

$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

Cảnh báo, PowerShell trước.

Một số cà phê đã giúp tôi đưa ra với điều này:

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

Và nếu bạn muốn nó ra gì cả, chỉ cần thay thế với out-null:

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

Bạn sử dụng nó như thế này:

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:\> 
Các vấn đề liên quan