我想在一些不同的条件下在linux shell中执行一些东西,并且能够输出每次执行的执行时间。

我知道我可以写一个perl或python脚本,可以做到这一点,但有一种方法我可以在shell中做到这一点吗?(恰好是bash)


当前回答

如果您只需要精确到秒,您可以使用内置的$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

其他回答

#!/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"

如果您只需要精确到秒,您可以使用内置的$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

你可以使用time和subshell ():

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
}

方法是

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

输出为>>

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

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

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或任何你喜欢的语法做同样的事情。我喜欢这个技巧。