Windows 命令行相当于 Linux 中的“时间”? [复制]

Posted

技术标签:

【中文标题】Windows 命令行相当于 Linux 中的“时间”? [复制]【英文标题】:Windows Command Line Equivalent to "time" in Linux? [duplicate] 【发布时间】:2015-01-31 11:42:30 【问题描述】:

我有一个可能很愚蠢的问题,但我似乎无法在网上的任何地方找到答案。在基于 linux 的系统中,在任何命令之前在终端中键入“时间”会给出命令所需的实际时间、用户时间和系统时间。例如,键入

time ls

列出当前目录中的文件和文件夹,然后给出列出文件和文件夹所需的实际时间、用户时间和系统时间。是否有与此等效的窗口?我正在尝试比较不同算法的性能,但没有可运行的 linux 机器,所以我希望 Windows 中有类似的命令。

【问题讨论】:

我查看了那个答案,但很好奇是否有办法获得系统和用户时间的单独读数,而不是实时。 在 PowerShell 中,您可以通过管道输入Measure-Command,但我不知道不同的时间细分。 ls | Measure-Command 在 Windows 中,很少有理由区分用户时间和内核时间。如果您想这样做,您可能需要编写自己的代码。 【参考方案1】:

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

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

加载 cmdlet 后,只需使用

调用它

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

-Silent 开关表示命令不生成任何输出(即您只对时间测量感兴趣)

例如:

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

生成的输出:

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

这里是 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"
    

【讨论】:

【参考方案2】:

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

Measure-Command ls

我的评论中有语法错误。

【讨论】:

我刚刚试过了。看起来那只是给出了实时的时间。您知道获取系统时间或用户时间的方法吗? 在 cmets 中提到过,不太清楚这是什么意思。如果您查看链接的帖子,那里也没有明确的共识 我不确切知道系统时间和用户时间代表什么,但我知道它们给出了命令独立于硬件运行所需的时间。我的猜测是他们计算时钟周期而不是秒数。

以上是关于Windows 命令行相当于 Linux 中的“时间”? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

linux shell 和linux 命令的区别?windows shell 和 windows 命令呢?

Linux命令Top详解

Linux中的基础和小工具

linux vi/vim常用命令(重要!)

Linux系统下安装DB2数据库时,正常执行./db2setup没有任何的反应,根本就没有安装界面!晕死了、、、、、

linux cp命令