我正在编写这个脚本,我必须运行一个程序,为其计时并将该时间写入文本文件,它必须以秒为单位,保留 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
单独重定向该命令,以便能够在单独的文件中获取相关输出。