首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算Linux中几个"time“命令的平均值

计算Linux中几个"time“命令的平均值
EN

Stack Overflow用户
提问于 2013-07-12 03:13:38
回答 4查看 3.6K关注 0票数 6

我正在分析Linux上的一个程序,使用"time“命令。问题是它的输出在统计上不是很相关,因为它只运行程序一次。有没有一种工具或方法可以获得平均几次“时间”运行?是否可能与偏差等统计信息结合在一起?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-10-30 02:40:11

这是我写的一个脚本,用来做一些与你正在寻找的事情相似的事情。它运行所提供的命令10次,将实际的用户CPU和系统CPU时间记录到一个文件中,并在每次命令输出后回显。然后,它使用awk提供文件中3列中每一列的平均值,但不包括标准差。

代码语言:javascript
复制
#!/bin/bash

rm -f /tmp/mtime.$$

for x in {1..10}
do
  /usr/bin/time -f "real %e user %U sys %S" -a -o /tmp/mtime.$$ $@
  tail -1 /tmp/mtime.$$
done

awk '{ et += $2; ut += $4; st += $6; count++ } END {  printf "Average:\nreal %.3f user %.3f sys %.3f\n", et/count, ut/count, st/count }' /tmp/mtime.$$
票数 8
EN

Stack Overflow用户

发布于 2021-07-26 01:39:04

使用hyperfine

例如:

代码语言:javascript
复制
hyperfine 'sleep 0.3'

将多次运行命令sleep 0.3,然后输出如下所示:

代码语言:javascript
复制
hyperfine 'sleep 0.3'
Benchmark #1: sleep 0.3
  Time (mean ± σ):     306.7 ms ±   3.0 ms    [User: 2.8 ms, System: 3.5 ms]
  Range (min … max):   301.0 ms … 310.9 ms    10 runs
票数 1
EN

Stack Overflow用户

发布于 2021-07-26 05:11:41

perf stat通过-r (-repeat=<n>)选项、average和variance为您完成此操作。

例如,在awk中使用短循环来模拟一些工作,短到足以使CPU频率上升和其他启动开销可能是一个因素(Idiomatic way of performance evaluation?),尽管我的CPU似乎相当快地上升到3.9 GHz,平均为3.82 GHz。

代码语言:javascript
复制
$ perf stat -r5 awk 'BEGIN{for(i=0;i<1000000;i++){}}'

 Performance counter stats for 'awk BEGIN{for(i=0;i<1000000;i++){}}' (5 runs):

             37.90 msec task-clock                #    0.968 CPUs utilized            ( +-  2.18% )
                 1      context-switches          #   31.662 /sec                     ( +-100.00% )
                 0      cpu-migrations            #    0.000 /sec                   
               181      page-faults               #    4.776 K/sec                    ( +-  0.39% )
       144,802,875      cycles                    #    3.821 GHz                      ( +-  0.23% )
       343,697,186      instructions              #    2.37  insn per cycle           ( +-  0.05% )
        93,854,279      branches                  #    2.476 G/sec                    ( +-  0.04% )
            29,245      branch-misses             #    0.03% of all branches          ( +- 12.79% )

           0.03917 +- 0.00182 seconds time elapsed  ( +-  4.63% )

(滚动到右侧以查看差异。)

如果您有一个单线程任务,并且想要最小化上下文切换,您可以使用taskset -c3 perf stat ...将任务固定到特定的核心(在这种情况下是#3)。

默认情况下,perf stat使用硬件性能计数器来分析指令、核心时钟周期(与现代CPU上的时间不同)和分支未命中等内容。这具有非常低的开销,特别是在计数器处于“计数”模式而不是perf record导致中断以统计方式对事件热点进行采样的情况下。

您可以使用-e task-clock来只使用该事件,而不使用HW性能计数器。(或者,如果您的系统在VM中,或者您没有更改默认的/proc/sys/kernel/perf_event_paranoid,则perf可能无论如何都无法请求内核进行任何编程。)

有关perf的更多信息,请参阅

对于打印输出的程序,如下所示:

代码语言:javascript
复制
$ perf stat -r5 echo hello
hello
hello
hello
hello
hello

 Performance counter stats for 'echo hello' (5 runs):

              0.27 msec task-clock                #    0.302 CPUs utilized            ( +-  4.51% )
...
          0.000890 +- 0.000411 seconds time elapsed  ( +- 46.21% )

对于单次运行(默认情况下没有-r),perf stat将显示经过的时间和用户/系统。但出于某种原因,-r并不会对这些数据进行平均。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17601539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档