我有一个可能是愚蠢的问题,但我似乎在网上找不到答案。在基于linux的系统中,在终端中,在任何命令前输入 "时间",就可以得到该命令在实际时间、用户时间和系统时间方面所需的时间。例如,输入

time ls

列出当前目录中的文件和文件夹,然后给出列出这些文件和文件夹所花费的实际时间、用户时间和系统时间。是否有一个与此相当的windows系统?我正试图比较不同算法的性能,但没有一台Linux机器可以使用,所以我希望在Windows中有一个类似的命令。

3 个评论
Code
我看了那个答案,但很好奇是否有办法获得系统和用户时间的单独读数,而不是只获得实时时间。
Matt
在PowerShell中,你可以通过管道进入Measure-Command,但我不知道不同的时间细分。替换代码1
在Windows中,很少有理由去区分用户时间和内核时间。 如果你想这么做,你可能需要自己写代码。
linux
windows
powershell
command-line
Code
Code
发布于 2014-12-03
2 个回答
Micky Balladelli
Micky Balladelli
发布于 2014-12-03
已采纳
0 人赞同

下面的内容远非完美。但这是我能想到的最接近模拟UNIX time的行为。我相信它可以改进很多。

基本上,我正在创建一个cmdlet,它接收一个脚本块,生成一个进程,并使用GetProcessTimes来获得内核、用户和耗时时间。

一旦加载了cmdlet,只需用以下命令调用它

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

替换代码3】开关表示没有命令产生的输出(即你只对时间测量感兴趣)。

因此,举例来说。

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

产生的输出。

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

Here is the 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()
        $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"
    
Matt
Matt
发布于 2014-12-03
0 人赞同

我发现一个类似的问题,在SuperUser其中涵盖了一些替代方法。首要的是我建议在PowerShell中使用Measure-Command