如何在脚本中对程序计时?

如何在脚本中对程序计时?

我正在编写这个脚本,我必须运行一个程序,为其计时并将该时间写入文本文件,它必须以秒为单位,保留 6 位小数。到目前为止我有这个:

#!/bin/bash

MAX_THREADS=8   #2 x number of cores

if [ $# -ne 2 ]; then                  #checks number of arguments
    echo Invalid number of arguments
    exit 1
else
    NUM_THREADS=$1
fi

if [ $NUM_THREADS -gt $MAX_THREADS ]; then     
    echo Invalid number of threads
    exit 1
fi    

make clean
make
start=$(date +%s)
./CircuitRouter-SeqSolver $2
end=$(date +%s)

 cat > $2.speedup.csv << EOF
 $((end-start))
 EOF

您可以忽略与脚本其他部分的 NUM_THREADS 相关的任何内容。所以我 make clean,make 然后以 $2 作为参数运行 CircuitRouter-SeqSolver,我看到这个带有日期的解决方案,但它只写入没有十进制数字的秒数,因此它只将 0 写入文件,因为程序花费的时间少于 1第二个完成。如何修改日期以写入小数?

答案1

假设date是GNU版本:

start=$(date +%s.%N)
./CircuitRouter-SeqSolver $2
end=$(date +%s.%N)

其他版本可能有也可能没有%N纳秒部分。要将分辨率限制为小数点后六位,您可以执行多种操作,但最简单的可能是:

printf "%0.6f\n" $((end-start))

编辑:修复bash不执行浮点数学:

printf %0.6f\n" $(echo $end-$start | bc)

答案2

你看过我的bosh包裹了吗http://schilytools.sourceforge.net/bosh.html?它是 Bourne Shell 当前维护的版本。

它支持以微秒级精度进行计时,请参阅 man 页面http://schillix.sourceforge.net/man/man1/bosh.1.html在参数部分(大约第 25 页)有变量的描述TIMEFORMAT

请注意,Linux 上的系统 CPU 时间和用户 CPU 时间的精度仅为 1 毫秒,但可以以微秒精度检索挂钟时间。

time您需要知道每个命令的内置或自动计时的输出都会stderr进入主 shell,并且您可能需要stderr单独重定向该命令,以便能够在单独的文件中获取相关输出。

相关内容