2014-12-03 12 views
6

Mam coś, co może być głupie pytanie, ale nie mogę znaleźć odpowiedzi w Internecie. W systemach opartych na Linuksie, w terminalu wpisując "time" przed jakimkolwiek poleceniem podaje się ile czasu zajmuje komenda pod względem czasu rzeczywistego, użytkownika i systemowego. Na przykład wpisanieWindows Command Line Odpowiednik "czasu" w systemie Linux?

time ls 

listy plików i folderów w bieżącym katalogu, następnie daje kwotę rzeczywistym, użytkownik, i czas systemowy, że wziął do listy plików i folderów. Czy istnieje odpowiednik okna? Próbuję porównać wydajność różnych algorytmów, ale nie mam maszyny do pracy z Linuksem, więc miałem nadzieję, że istnieje podobne polecenie w systemie Windows.

+0

Spojrzałem na tę odpowiedź, ale był ciekaw, czy istnieje sposób, aby uzyskać oddzielne odczyty czasu systemowego i użytkownika, a nie tylko w czasie rzeczywistym. – Code

+0

W PowerShell możesz potokować w 'Measure-Command', ale nie znam różnych podziałów czasu. 'ls | Measure-Command' – Matt

+0

W systemie Windows rzadko istnieje powód do rozróżniania czasu użytkownika od czasu jądra. Prawdopodobnie będziesz musiał napisać własny kod, jeśli chcesz to zrobić. –

Odpowiedz

5

Następujące rozwiązanie jest dalekie od doskonałości. Ale jest to najbliżej możliwe do symulowania zachowanie UNIX time. Jestem pewien, że można go znacznie poprawić.

Zasadniczo tworzę cmdlet, który odbiera blok skryptu, generuje proces i używa GetProcessTimes, aby uzyskać czasy Kernel, User i Elapsed.

Po cmdlet jest załadowany, po prostu wywołać ją z

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

Przełącznik -Silent oznacza brak wyjścia wygenerowany z polecenia (czyli jesteś zainteresowany tylko w środkach czasowych)

więc dla Przykład:

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

wyjście generowane:

Kernel time : 0.6084039 
User time : 0.6864044 
Elapsed  : 00:00:06.6144000 

Oto 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

Znalazłem podobne pytanie na SuperUser, które obejmuje niektóre alternatywy. Przede wszystkim jest moją propozycją użycia Measure-Command w PowerShell.

Measure-Command {ls} 

Nieprawidłowa składnia w moim komentarzu.

+0

Właśnie to wypróbowałem. Wygląda jednak na to, że daje tylko czas rzeczywisty. Czy znasz sposób na uzyskanie czasu systemowego lub czasu użytkownika? – Code

+0

Wymienione w komentarzach, nie do końca pewne, co to oznacza. Jeśli spojrzysz na powiązany link, nie ma wyraźnego porozumienia tam – Matt

+0

Nie wiem dokładnie, co czas systemowy i czas użytkownika reprezentują, ale wiem, że dają czas potrzebny komendzie do uruchomienia niezależnie od sprzętu. Domyślam się, że liczą cykle zegara, a nie sekundy. – Code

Powiązane problemy