2014-12-03 6 views
6

Ho quella che potrebbe essere una domanda stupida ma non riesco a trovare la risposta ovunque online. Nei sistemi basati su linux, nel terminale digitando "time" prima di ogni comando si indica quanto tempo impiega il comando in termini di tempo reale, utente e di sistema. Ad esempio, digitandoRiga di comando di Windows Equivale a "time" in Linux?

time ls 

elenca i file e le cartelle nella directory corrente poi dà la quantità di beni, l'utente, e ora del sistema che ci sono voluti per elencare i file e le cartelle. C'è una finestra equivalente a questo? Sto cercando di confrontare le prestazioni di diversi algoritmi, ma non ho una macchina Linux su cui lavorare, quindi speravo che ci fosse un comando simile in Windows.

+0

Ho guardato oltre che risposta, ma era curioso di vedere se ci fosse un modo per ottenere letture separate del tempo di sistema e l'utente in contrasto con appena in tempo reale. – Code

+0

In PowerShell è possibile reindirizzare in 'Measure-Command' ma non conosco le diverse suddivisioni in base all'ora. 'ls | Measure-Command' – Matt

+0

In Windows, raramente c'è un motivo per distinguere tra tempo utente e ora del kernel. Probabilmente dovresti scrivere il tuo codice se vuoi farlo. –

risposta

5

Quanto segue è tutt'altro che perfetto. Ma è il più vicino che potrei inventare per simulare il comportamento di UNIX time. Sono sicuro che può essere migliorato molto.

Fondamentalmente sto creando un cmdlet che riceve un blocco di script, genera un processo e utilizza GetProcessTimes per ottenere Kernel, Utente e Tempo trascorso.

Una volta che il cmdlet viene caricato, basta invocarlo con

Measure-Time -Command {your-command} [-silent]

L'interruttore -Silent significa nessun output generato dal comando (Ie si è interessati solo nelle misure di tempo)

Così, per esempio:

Measure-Time -Command {Get-Process;sleep -Seconds 5} -Silent 

L'output generato:

01.235.164,106 mila
Kernel time : 0.6084039 
User time : 0.6864044 
Elapsed  : 00:00:06.6144000 

Ecco il 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" 
    } 
} 
4

Ho trovato una domanda simile su SuperUser che copre alcune alternative. Innanzitutto è il mio suggerimento di utilizzare Measure-Command in PowerShell.

Measure-Command {ls} 

Ho sbagliato la sintassi nel mio commento.

+0

L'ho appena provato. Sembra che dia solo il tempo reale però. Conosci un modo per ottenere l'ora del sistema o l'ora dell'utente? – Code

+0

Menzionato nei commenti, non proprio sicuro di cosa significhi. Se si guarda il post collegato non c'è un chiaro consenso o – Matt

+0

Non so esattamente quale sia l'ora del sistema e l'ora dell'utente, ma so che danno il tempo necessario per eseguire un comando indipendentemente dall'hardware. La mia ipotesi è che contano i cicli di clock anziché i secondi. – Code