脚本的时间部分(运行时间)

Posted

技术标签:

【中文标题】脚本的时间部分(运行时间)【英文标题】:time part of a script (running time) 【发布时间】:2020-12-17 21:18:19 【问题描述】:

使用time script.sh,您将获得运行脚本所需的时间,但是如果您想为脚本的一部分计时?

假设我想测试一个循环需要多长时间,我可以使用 $SECONDS 函数,但是是否有任何以毫秒计的计时器?

例如在长代码中间:

    timerstart
    until [[ $loop -eq 10000 ]]; do
     ((++loop))

    echo "annoying"
    done
    timerstop

然后在脚本的最后,我只添加了 echo $timerresult ,它会显示只运行所选代码所花费的毫秒数,而不是脚本的其余部分

我正在寻找这个解决方案,这样我就可以测试部分脚本的“缓慢性”.. 这个可以解决吗?

【问题讨论】:

【参考方案1】:

对于 Bash 5.0 及更高版本,您可以使用$EPOCHREALTIME

[...] 它扩展为自 Unix 纪元以来的秒数,作为具有微秒粒度的浮点值 [...]

start=$EPOCHREALTIME
for ((i = 0; i < 10000; ++i)); do
    echo "annoying"
done
stop=$EPOCHREALTIME

elapsed=$(bc -l <<< "$stop - $start")

【讨论】:

有很多很好的建议,但我认为你的建议最适合我的需要,因为这样你可以在一个脚本中计时几个函数(有几个开始/结束点并在之后设置结果,所以通过植入你的想法并以time script.sh 开始脚本我会得到一个完整的时间和不同循环和东西的时间!【参考方案2】:

你可以使用

date '+%s.%N'

以纳秒精度获取当前时间。

#!/bin/bash
start=$(date '+%s.%N')
until [[ $loop -eq 10000 ]]; do
    ((++loop))
    
    echo "annoying"
done
stop=$(date '+%s.%N')
bc <<< $stop-$start

【讨论】:

【参考方案3】:

您也可以在脚本中为各个部分使用time,例如为循环计时:

time until [[ $loop -eq 10000 ]]; do
 ((++loop))

 echo "annoying"
done

或者用大括号对一组命令进行计时:

time 
 until [[ $loop -eq 10000 ]]; do
  ((++loop))
 done

 echo "Other commands here that are also timed"

【讨论】:

【参考方案4】:

将循环放入函数中。

#!/bin/bash
myloop() 
    loop=1
    until [[ $loop -eq 10000 ]]; do
       ((++loop))
       echo "annoying"
    done


time myloop

【讨论】:

以上是关于脚本的时间部分(运行时间)的主要内容,如果未能解决你的问题,请参考以下文章

shell 外部传入jmeter脚本线程数,rampUp时间,持续运行时间

如何运行作为我在 AWS SSH 会话中上传的应用程序的一部分的 Python 脚本?

为啥我的 Ubuntu EC2 实例的 DataUser 部分中的脚本没有运行?我正在使用 Cloudformation

运行远程脚本的意外行为

如何从 C++ 程序运行 python 脚本?

是否可以使用 Apps 脚本运行 Google 表格插件?