用于计算已用时间的Bash脚本
1. 概述
**我们将一段代码的经过时间定义为该块执行所需的时间。**在本教程中,我们将探索如何在 Linux 中测量经过的时间。
2. 使用date命令
众所周知,sleep 命令会等待指定的秒数。我们将使用它作为示例代码块,因为它可以让我们以某种精确的方式定义代码块运行所需的时间。
现在让我们使用*date *计算经过的时间。
让我们创建一个elapsed_time.sh脚本:
start=$(date +%s)
sleep 5
sleep 7
end=$(date +%s)
echo "Elapsed Time: $(($end-$start)) seconds"
我们使用*$()来初始化开始和结束变量。$()*用于命令替换。因此,它运行内部的命令并将结果捕获到相应的变量中。
请注意,我们*使用*$(())来计算算术运算的结果。
现在让我们运行我们的脚本:
$ ./<em>elapsed_time</em>.sh
Elapsed Time: 12 seconds
3. 使用内部变量*$SECONDS*
我们可以使用 Bash shell 的内部变量*$SECONDS来计算经过的时间。引用时,** $SECONDS输出自调用当前 shell 以来经过的秒数**。然后让我们制作另一个版本的elapsed_time.sh*脚本:
SECONDS=0
sleep 5
sleep 7
echo "Elapsed Time (using \$SECONDS): $SECONDS seconds"
在代码块开始之前,我们将SECONDS变量的值设置为零。请注意,使用非整数值会将其设置为零。
一旦我们的示例代码块完成,$SECONDS将包含该代码块的执行时间。请注意,在这种情况下,不需要算术运算。
让我们再次运行我们的脚本并检查结果:
$ ./script.sh
Elapsed Time (using $SECONDS): 12 seconds
4. 使用 Bash Shell 的TIMEFORMAT
我们还可以使用 Bash shell 的TIMEFORMAT 结合*time *命令来计算花费在命令块上的确切时间,精度为毫秒。让我们创建另一个版本的计算脚本:
TIMEFORMAT='It took %R seconds.'
time {
sleep 5
sleep 7
}
在定义TIMEFORMAT字符串之后,我们应该在time{}中包装我们的命令。TIMEFORMAT是一种字符串格式,将在time{}包装器内的块代码执行完成后打印。%R指定以毫秒为单位打印经过的时间。 让我们测试一下我们的脚本:
$ ./elapsed_time.sh
It took 12.008 seconds.
在TIMEFORMAT中,我们可以在R之前使用一个数字来指定要在小数点后打印的小数位数。因此,零值 ( %0R ) 会导致在经过的时间输出中不打印小数点:
TIMEFORMAT='It took %0R seconds.'
time {
sleep 5
sleep 7
}
让我们再次运行我们的脚本:
$ ./elapsed_time.sh
It took 12 seconds.
指定精度的可选数字的默认值为 3。请注意,如果我们指定任何大于 3 的数字,它将被替换为 3。
值得注意的是,使用time命令,我们还可以计算在用户模式或系统模式下花费的 CPU 时间。
5. 以纳秒为单位的经过时间
所有这些方法都以秒或毫秒为单位计算经过的时间。如果我们想要以纳秒为单位的经过时间,我们可以使用date命令的%N*选项*:
start=$(date +%s%N)
sleep 5
sleep 7
end=$(date +%s%N)
echo "Elapsed time: $(($end-$start)) ns"
让我们检查一下结果:
$ ./elapsed_time.sh
Elapsed time: 12023674735 ns
请注意,如果我们想再次以毫秒为单位,我们应该将纳秒输出除以 100 万:
start=$(date +%s%N)
sleep 5
sleep 7
end=$(date +%s%N)
echo "Elapsed time: $(($(($end-$start))/1000000)) ms"
现在,让我们运行这个新版本:
$ ./elapsed_time.sh
Elapsed time: 12022 ms