在shell中获取程序执行时间

2024-10-23 08:47:00
admin
原创
238
摘要:问题描述:我想要在几个不同的条件下在 Linux Shell 中执行某些操作,并能够输出每次执行的执行时间。我知道我可以编写一个 perl 或 python 脚本来执行此操作,但是有没有办法可以在 shell 中执行此操作?(碰巧是 bash)解决方案 1:使用内置time关键字:$ 帮助时间 时间:时间[...

问题描述:

我想要在几个不同的条件下在 Linux Shell 中执行某些操作,并能够输出每次执行的执行时间。

我知道我可以编写一个 perl 或 python 脚本来执行此操作,但是有没有办法可以在 shell 中执行此操作?(碰巧是 bash)


解决方案 1:

使用内置time关键字:

$ 帮助时间

时间:时间[-p]管道
    执行 PIPELINE 并打印实时、用户 CPU 时间的摘要,
    以及执行 PIPELINE 终止时的系统 CPU 时间。
    返回状态是 PIPELINE 的返回状态。‘-p’选项
    以稍微不同的格式打印时间摘要。这使用
    TIMEFORMAT 变量的值作为输出格式。

例子:

$ time sleep 2
实际 0分2.009秒
用户 0分0.000秒
系统 0分0.004秒

解决方案 2:

您可以获得比 bash 内置函数time(即Robert Gamble 提到的time(1)/usr/bin/time )更详细的信息。通常情况下,这是。

编者注:为确保调用的是外部实用程序 time,而不是 shell 的time 关键字,请将其调用为/usr/bin/time
time是POSIX 授权的实用程序,但它需要支持的唯一选项是-p。特定平台实现特定的非标准扩展:与GNU的实用程序-v一起使用,如下所示(问题标记为timeLinux的);BSD/macOS 实现使用-l来产生类似的输出 - 参见man 1 time

详细输出的示例:

$ /usr/bin/time -v sleep 1
       Command being timed: "sleep 1"
       User time (seconds): 0.00
       System time (seconds): 0.00
       Percent of CPU this job got: 1%
       Elapsed (wall clock) time (h:mm:ss or m:ss): 0:01.05
       Average shared text size (kbytes): 0
       Average unshared data size (kbytes): 0
       Average stack size (kbytes): 0
       Average total size (kbytes): 0
       Maximum resident set size (kbytes): 0
       Average resident set size (kbytes): 0
       Major (requiring I/O) page faults: 0
       Minor (reclaiming a frame) page faults: 210
       Voluntary context switches: 2
       Involuntary context switches: 1
       Swaps: 0
       File system inputs: 0
       File system outputs: 0
       Socket messages sent: 0
       Socket messages received: 0
       Signals delivered: 0
       Page size (bytes): 4096
       Exit status: 0

解决方案 3:

#!/bin/bash
START=$(date +%s)
# do something
# start your script work here
ls -R /etc > /tmp/x
rm -f /tmp/x
# your logic ends here
END=$(date +%s)
DIFF=$(( $END - $START ))
echo "It took $DIFF seconds"

解决方案 4:

对于逐行增量测量,请尝试gnomon。

$ npm install -g gnomon
$ <your command> | gnomon --medium=1.0 --high=4.0 --ignore-blank --real-time=100

命令行实用程序,有点像 moreutils 的 ts,用于将时间戳信息添加到另一个命令的标准输出中。对于需要记录耗时较长的进程的历史记录的长时间运行的进程非常有用。

您还可以使用--highand/or--medium选项指定长度阈值(以秒为单位),gnomon 将以红色或黄色突出显示时间戳。您还可以执行其他一些操作。

例子

解决方案 5:

如果您想要更高的精度,请使用%Nwith date(并使用bcdiff,因为$(())只处理整数)。

具体操作如下:

start=$(date +%s.%N)
# do some stuff here
dur=$(echo "$(date +%s.%N) - $start" | bc)

printf "Execution time: %.6f seconds" $dur

例子:

start=$(date +%s.%N); \n  sleep 0.1s; \n  dur=$(echo "$(date +%s.%N) - $start" | bc); \n  printf "Execution time: %.6f seconds
" $dur

结果:

Execution time: 0.104623 seconds

解决方案 6:

如果您打算稍后使用这些时间进行计算,请学习如何使用选项-f/usr/bin/time输出节省时间的代码。以下是我最近用来获取和排序全班学生程序执行时间的一些代码:

fmt="run { date = '$(date)', user = '$who', test = '$test', host = '$(hostname)', times = { user = %U, system = %S, elapsed = %e } }"
/usr/bin/time -f "$fmt" -o $timefile command args...

后来我把所有$timefile文件连接起来,并将输出导入Lua 解释器。你可以用 Python 或 bash 或任何你喜欢的语法做同样的事情。我喜欢这种技术。

解决方案 7:

如果只需要精确到秒,那么可以使用内置$SECONDS变量,它计算 shell 已运行的秒数。

while true; do
    start=$SECONDS
    some_long_running_command
    duration=$(( SECONDS - start ))
    echo "This run took $duration seconds"
    if some_condition; then break; fi
done

解决方案 8:

您可以使用timesubshel​​l ()

time (
  for (( i=1; i<10000; i++ )); do
    echo 1 >/dev/null
  done
)

或者在同一个 shell 中{}

time {
  for (( i=1; i<10000; i++ )); do
    echo 1 >/dev/null
  done
}

解决方案 9:

方法是

$ > g++ -lpthread perform.c -o per
$ > time ./per

输出是>>

real    0m0.014s
user    0m0.010s
sys     0m0.002s

解决方案 10:

一种可能简单的方法(可能无法满足不同用户的需求)是使用 shell PROMPT。这是一种在某些情况下很有用的简单解决方案。您可以像以下示例一样使用 bash 提示功能:

导出 PS1='[     /u@h]$'

上述命令将导致 shell 提示符更改为:

[HH:MM:SS 用户名@主机名]$

每次运行命令(或按回车键)返回到 shell 提示符时,提示符都会显示当前时间。

注意:

1)请注意,如果您在输入下一个命令之前等待了一段时间,那么需要考虑这个时间,即 shell 提示符中显示的时间是显示 shell 提示符时的时间戳,而不是输入命令时的时间戳。有些用户选择在准备好下一个命令之前按 Enter 键来获取具有新时间戳的新提示符。2

还有其他可用选项和修饰符可用于更改 bash 提示符,有关更多详细信息,请参阅(man bash)。

解决方案 11:

perf statLinux CLI 实用程序

这个工具对于节省时间来说有点大材小用。但它可以帮你做很多事情,帮助你分析和修复速度缓慢的问题,值得了解。Ubuntu 22.04 设置:

sudo apt install linux-tools-common linux-tools-generic
echo -1 | sudo tee /proc/sys/kernel/perf_event_paranoid

用法:

perf stat <mycmd>

示例运行如下stress-ng

perf stat stress-ng --cpu 1 --cpu-method matrixprod -t 5

示例输出:

 Performance counter stats for 'stress-ng --cpu 1 --cpu-method matrixprod -t 5':

          5,005.46 msec task-clock                #    0.999 CPUs utilized          
                88      context-switches          #   17.581 /sec                   
                 1      cpu-migrations            #    0.200 /sec                   
             1,188      page-faults               #  237.341 /sec                   
    18,847,667,167      cycles                    #    3.765 GHz                    
    26,544,261,897      instructions              #    1.41  insn per cycle         
     3,239,655,001      branches                  #  647.225 M/sec                  
        25,393,369      branch-misses             #    0.78% of all branches        

       5.012218939 seconds time elapsed

       4.998051000 seconds user
       0.009122000 seconds sys

perf还可以做许多更高级的事情,例如这里我展示了如何使用它来分析代码:如何分析在 Linux 上运行的 C++ 代码?

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用