2011-11-11 15 views
8

私はSOの上で偉大なanswerを読んでいましたが、なぜそれがまだPowerShellでエミュレートされていないのか疑問に思っていました。PowerShellのUnixのtimeコマンドに相当しますか?

unix/linuxでは、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 

しかし、これは本当の、ユーザーおよびSYSは(中3の違いを参照してください報告time、同じではありません。

$ time ./script1.sh 

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

PowerShellでは、我々はmeasure-command同様に使用することができますリンクされたSO答え。)

この(time)は明らかにそのような有用な小さなツールです。この機能のためのコマンドレットを書いたユーザーがいますか、または既にV3に入っているか、または今後のリリースで計画されていますか?

答えて

2

GetProcessTimes関数を使用してCプログラムを作成すると、そのドキュメントはhttp://msdn.microsoft.com/en-us/library/ms683223%28VS.85%29.aspxにあります。

「Windowsシステムプログラミング」の例では、その機能を使用して必要なもの(Elapsed、Kernel、User times)を正確に取得するプログラムが提供されています。このプログラムは "timep.exe"と呼ばれ、圧縮されたサンプルアーカイブ内のrunXサブディレクトリ(コンパイルで使用されるVisual Studioのバージョンに由来します)にあります。ここには、そのアーカイブhttp://www.jmhartsoftware.com/をダウンロードできる著者ページがあります。もちろん、ソースコードもそこにあるので、timep.exeの動作を正確に見ることができます。

1

私はtimeの実装を思い付くSystem.Diagnostics.ProcessGetProcessTimesが提供する時間の両方を使用:

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

実際の時間は約11秒(sleep 10用)として出てくるとそれは本当に完璧ではありません私はpowershellプロセスを作成し、そのコマンドを実行しているからです。このためにコマンドレットなどを実装できるかどうかがわかります。

+1

私はWindows Powershellの使用に本当に慣れています。あなたの 'time'実装を使用するために必要なことを説明できますか? – Amndeep7

0

測定しようとしているプロセスもまた、バックグラウンドで分岐して実行され、Measure-Command測定が短くなります。 Start-Process-Waitパラメータを使用して、フルタイム測定値を得ることができます。次に、idleoverflow.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:\> 
関連する問題