AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / computer / 问题 / 1517522
Accepted
Hashim Aziz
Hashim Aziz
Asked: 2020-01-16 13:29:17 +0800 CST2020-01-16 13:29:17 +0800 CST 2020-01-16 13:29:17 +0800 CST

时间需要多少时间?

  • 772

shell 关键字可以用来计算一个进程需要多长时间,但它本身实际上给进程增加time了多少开销?time

换句话说,与 计时时命令运行的速度会慢多少time:

time grep "a string"

...比不计时时:

grep "a string"
bash time
  • 3 3 个回答
  • 304 Views

3 个回答

  • Voted
  1. kenorb
    2020-01-16T13:41:51+08:002020-01-16T13:41:51+08:00

    time您可以通过将其包装到另一个中来测试需要多少time:

    time time true
    

    注意:我添加true的是“什么都不做”的简单命令。

    真的 - 什么都不做,成功 -man true

    在我的身上,它显示:

    real:0m0.000s user:0m0.000s sys:0m0.000s
    

    即使出现 20 次:

    $ time time time time time time time time time time time time time time time time time time time time true true
    real:0m0.000s user:0m0.000s sys:0m0.000s
    

    这里有 1000 个:

    $ eval $(for i in $(seq 1 1000); do printf "time "; done) true
    real:0m0.000s user:0m0.000s sys:0m0.000s
    

    man time提供了一些如何计算时间的线索:

    time 显示的大多数信息都来自 wait3(2) 系统调用。这些数字仅与 wait3(2) 返回的数字一样好。在没有返回状态信息的 wait3(2) 调用的系统上,将使用 times(2) 系统调用。但是,它提供的信息比 wait3(2) 少得多,因此在这些系统上,时间将大部分资源报告为零。

    有关更多技术细节,请查看:man 2 wait3或man wait4。


    time要在 Linux 上调试,您可以使用strace,例如

    $ strace -f time true
    

    要计算系统调用-c的时间 ( ) 并总结时间差 ( -s),请运行:

    $ strace -fwc time true
    % time     seconds  usecs/call     calls    errors syscall
    ------ ----------- ----------- --------- --------- ----------------
     30.91    0.007723          69       112           write
     27.19    0.006794        6794         1           wait4
     20.44    0.005107         340        15        13 execve
      7.43    0.001855        1855         1           clone
      2.94    0.000734         122         6         6 access
    ...
    

    以下是如何调试time10 次:

    $ strace -fwc $(echo $(for i in $(seq 1 10); do printf "time "; done)) true | head
    % time     seconds  usecs/call     calls    errors syscall
    ------ ----------- ----------- --------- --------- ----------------
     87.35    1.057704      105770        10           wait4
      7.33    0.088807          79      1120           write
      2.25    0.027275         222       123       112 execve
      1.37    0.016571        1657        10           clone
      0.32    0.003913          71        55           mmap
      0.32    0.003844         116        33        33 access
      ...
    

    1000次:

    $ strace -fwc $(echo $(for i in $(seq 1 100); do printf "time "; done)) true | head
    % time     seconds  usecs/call     calls    errors syscall
    ------ ----------- ----------- --------- --------- ----------------
     98.66  112.115311     1121153       100           wait4
      0.77    0.874091          78     11200           write
      0.24    0.271382         226      1203      1102 execve
      0.16    0.179477        1795       100           clone
      0.03    0.037229         123       303       303 access
      0.03    0.036702          73       505           mmap
    ...
    

    显然在调试器下运行,运行实际命令的时间会慢一些,但它可以大致了解正在使用什么样的系统调用以及与其他相比它们可以使用多少时间。

    • 1
  2. Best Answer
    Kamil Maciorowski
    2020-01-16T17:58:23+08:002020-01-16T17:58:23+08:00

    初步说明

    有时很容易混淆time实用程序。您明确询问了“shell关键字time”。


    代码

    以下代码将运行测量true(它是 Bash 中内置的 shell)n次,然后不测量true相同的次数。减去相应的结果并除以n。

    export n=10000000
    time bash -c 'for ((i=1;i<=n;i++)); do time true; done' 2>/dev/null
    time bash -c 'for ((i=1;i<=n;i++)); do      true; done' 2>/dev/null
    

    例子

    因为n=10000000我分别得到:

    real    1m32.693s
    user    1m13.679s
    sys     0m18.998s
    

    real    0m39.344s
    user    0m39.343s
    sys     0m0.000s
    

    各自的区别:

    real    53.349s
    user    34.336s
    sys     18.998s
    

    每人time:

    real    5.3349μs
    user    3.4336μs
    sys     1.8998μs
    

    分析

    这些取决于操作系统的一般和临时速度,因此您的结果会有所不同。我的测试平台是一台配备 i7 CPU、Kubuntu 18.04.3 LTS、Bash 4.4.20 的笔记本电脑。我也有一台速度较慢的计算机作为家用路由器/服务器。结果就像36μs, 21μs, 15μs. 现在您知道预期的幅度了。

    我还测试了不同的n值。总时间表现出良好的线性。换句话说,“每个人time”的结果不依赖于n。关于我的代码,这是意料之中的。


    结论

    time在我的 Bash 中提供分辨率为 1 毫秒的测量。即使在相对较慢的计算机上,开销也要小 20 倍以上。我会说它可以忽略不计。


    奖金

    另一个time呢?

    在我的笔记本电脑上,我time在循环中替换为/usr/bin/time(并且true在/bin/true两行中都替换为,因为/usr/bin/time true无法使用true内置函数)。这些是(有些四舍五入的)每一个/usr/bin/time获得的结果n=100000:

    real    600μs
    user    530μs
    sys      80μs
    

    外部可执行文件比内置文件慢大约 100 倍。实际上,单次调用/usr/bin/time可能需要更长的时间,因为操作系统可能需要从 HDD 读取可执行文件。然后文件被缓存,所以在我的人工测试中,循环的其余部分受益,如果n足够大,这个初始延迟将变得微不足道。

    相比之下time,Bash 提供的即使在第一次运行时也应该同样快,因为bash已经加载(虽然我还没有测试过)。

    回到/usr/bin/time。我预计在较慢的机器上开销很容易超过 1 毫秒。

    • 1
  3. AndreasT
    2020-01-16T18:22:35+08:002020-01-16T18:22:35+08:00

    原则上,时间只不过是等待子进程完成(字面意思是wait3()完全停止执行time自己的进程的调用),然后向内核询问子进程的资源使用情况统计信息。所以实际上time对子进程的运行时间没有影响。

    这些统计数据似乎总是被收集。似乎没有“开始监控”模式或会减慢子进程的东西。我在这里使用“似乎”,因为我无法查看代码,也找不到明确证实这一点的来源。

    来源/这个兔子洞的入口:http: //man7.org/linux/man-pages/man2/wait4.2.html

    • 1

相关问题

  • 在非 root 用户上用 bash 替换 zsh

  • 在 macOS High Sierra 的终端中设置环境变量时遇到问题

  • 对于 cp 或 mv,是否有等同于 cd - 的东西?

  • Notify-发送窗口下出现的通知

  • 如何从 WSL 打开 office 文件

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何减少“vmmem”进程的消耗?

    • 11 个回答
  • Marko Smith

    从 Microsoft Stream 下载视频

    • 4 个回答
  • Marko Smith

    Google Chrome DevTools 无法解析 SourceMap:chrome-extension

    • 6 个回答
  • Marko Smith

    Windows 照片查看器因为内存不足而无法运行?

    • 5 个回答
  • Marko Smith

    支持结束后如何激活 WindowsXP?

    • 6 个回答
  • Marko Smith

    远程桌面间歇性冻结

    • 7 个回答
  • Marko Smith

    子网掩码 /32 是什么意思?

    • 6 个回答
  • Marko Smith

    鼠标指针在 Windows 中按下的箭头键上移动?

    • 1 个回答
  • Marko Smith

    VirtualBox 无法以 VERR_NEM_VM_CREATE_FAILED 启动

    • 8 个回答
  • Marko Smith

    应用程序不会出现在 MacBook 的摄像头和麦克风隐私设置中

    • 5 个回答
  • Martin Hope
    CiaranWelsh 如何减少“vmmem”进程的消耗? 2020-06-10 02:06:58 +0800 CST
  • Martin Hope
    Jim Windows 10 搜索未加载,显示空白窗口 2020-02-06 03:28:26 +0800 CST
  • Martin Hope
    v15 为什么通过电缆(同轴电缆)的千兆位/秒 Internet 连接不能像光纤一样提供对称速度? 2020-01-25 08:53:31 +0800 CST
  • Martin Hope
    fixer1234 “HTTPS Everywhere”仍然相关吗? 2019-10-27 18:06:25 +0800 CST
  • Martin Hope
    andre_ss6 远程桌面间歇性冻结 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney 为什么在 URL 后面加一个点会删除登录信息? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension 鼠标指针在 Windows 中按下的箭头键上移动? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    jonsca 我所有的 Firefox 附加组件突然被禁用了,我该如何重新启用它们? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK 是否可以使用文本创建二维码? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 更改 git init 默认分支名称 2019-04-01 06:16:56 +0800 CST

热门标签

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve