【问题标题】:In bash, how to profile the running time of some part of my script?在 bash 中,如何分析我的脚本某些部分的运行时间?
【发布时间】:2012-10-30 20:10:14
【问题描述】:

在Java程序中,我通常使用以下函数来分析时间信息:

...
long start = System.currentTimeMillis();
...
...
System.out.println("elapsed time 1: "+(System.currentTimeMills() - start));
...
...
start = System.currentTimeMillis();
...
System.out.println("elapsed time 2: "+(System.currentTimeMills() - start));
...

如何在 shell bash 中做类似的事情?另外,如果有循环,如何收集累计时间?

例如

for ((i=0;i<$lines;i=i+$step))
do    
    head -$((i+step)) $1 | tail -$step > tmp1
    head -$((i+step)) $2 | tail -$step > tmp2
    setstr=$setstr' '`./accuracy.sh tmp1 tmp2`
done
echo $setstr | awk '{for (i=1;i<=NF;i++) sum+=$i; }END{print sum/NF}'

我想分别分析累积的head/tail 时间和accuracy.sh tmp1 tmp2 时间。

【问题讨论】:

标签: bash shell


【解决方案1】:

您可以使用适当命名的time 命令为您希望计时的命令添加前缀。

例如:

time find . -type f -name hello_world.cc

或者在你的情况下:

time head -$((i+step)) $1 | tail -$step > tmp1
time head -$((i+step)) $2 | tail -$step > tmp2
time setstr=$setstr' '`./accuracy.sh tmp1 tmp2`

注意时间输出到tty,所以你不必担心时间结果被写入tmp1tmp2等。

如果您想实时查看总运行时间(因为脚本已经开始运行)更新,您可以这样做:

在脚本开始时,记下系统时间:

start_timestamp=$(date +%s)

然后启动您的实际脚本 main:

# Do your execution here

然后在你的循环中,无论你想看到到目前为止已用时间的输出

curr_timestamp=$(date +%s)
elapsed_time=$(expr $end_time - $start_time)
echo "Elapsed: $elapsed_time" >> elapsed_time.log

【讨论】:

  • 很好的解释。那么进一步,如何收集累计时间?
  • @JackWM 如果累计时间是指脚本的总运行时间,则使用time ./my_script_name。如果您想查看经过时间信息的秒表式更新,请立即查看我编辑的帖子。
  • 我是指每个部分的累计时间,而不是总时间。
  • @JackWM 如果您想要每个部分的累积时间(我假设您的意思是循环的每次迭代),请将循环中的逻辑放在单独的函数中,然后调用循环中的函数。然后在函数上使用time
  • 我可以创建一个变量sum_elapsed_time 并执行sum_elapsed_time += elapsed_time 之类的操作吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-26
  • 1970-01-01
  • 2020-05-25
  • 2010-10-06
相关资源
最近更新 更多