Contents

用于计算已用时间的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