Bash 用三个尾随数字以秒为单位打印经过的时间
对于我正在编写的框架,我想测量一段bash代码执行所需的时间,然后以秒为单位打印所用的时间 对于测量,我执行以下操作:Bash 用三个尾随数字以秒为单位打印经过的时间,bash,Bash,对于我正在编写的框架,我想测量一段bash代码执行所需的时间,然后以秒为单位打印所用的时间 对于测量,我执行以下操作: start=$(date +%s%N) # do something here elapsed_time=$(($(date +%s%N) - start)) 这给了我经过的秒数和经过的纳秒数。如果我现在除以1000000,我会得到毫秒的时间 elapsed_time_in_ms=$(($elapsed time / 1000000)) 这一切都很好,似乎很有效,但真正
start=$(date +%s%N)
# do something here
elapsed_time=$(($(date +%s%N) - start))
这给了我经过的秒数和经过的纳秒数。如果我现在除以1000000,我会得到毫秒的时间
elapsed_time_in_ms=$(($elapsed time / 1000000))
这一切都很好,似乎很有效,但真正的问题是我想以这种格式打印:
12.789s
在那之前。是秒,点后是ms值的最后3位
我怎样才能实现这样的目标
编辑
我知道时间可能不会有多大用处,但我仍然希望实现这一点,即使只是出于表面原因:-
编辑2
对于面临相同问题的任何人:
最后,我选择使用时间,因为它不需要叉子,而且似乎是最可移植的解决方案
请查看it函数和全局总已用时间变量,了解我是如何实现的。您可以使用bc命令:
刻度基本上设置了您想要的数字位数。您可以使用bc命令:
scale基本上设置了您想要的数字位数。这也可以使用shell参数展开或通过printf来完成。例如,依次运行以下两个序列在一次运行中打印出1349883230.715和1349883230.721,在另一次运行中打印出1349884003.025和1349884003.032。%N日期格式用前导零填充
s=$(date +%s.%N); s=${s%??????}; echo $s
t=$(printf "%20.3f" $(date +%s.%N)); echo $t
正如在模式匹配下的ManBash中提到的,特殊模式字符?匹配任何单个字符。如参数展开中所述,表格
${参数%word}
删除匹配的后缀模式:“如果模式匹配尾随部分…扩展是参数的扩展值,具有最短匹配模式%case或最长匹配模式%%case已删除。”这也可以使用shell参数扩展或通过printf完成。例如,依次运行以下两个序列在一次运行中打印出1349883230.715和1349883230.721,在另一次运行中打印出1349884003.025和1349884003.032。%N日期格式用前导零填充
s=$(date +%s.%N); s=${s%??????}; echo $s
t=$(printf "%20.3f" $(date +%s.%N)); echo $t
正如在模式匹配下的ManBash中提到的,特殊模式字符?匹配任何单个字符。如参数展开中所述,表格
${参数%word}
删除匹配后缀模式:“如果模式匹配尾随部分…扩展是参数的扩展值,具有最短匹配模式%case或最长匹配模式%%case已删除。”只需将前三个数字从纳秒中剪掉即可 printf%d.%.3ss\n日期+%S日期+%n顺便说一句,只运行一次日期可能不是非常不明智的 -打印一个数字,后跟一个点,然后将下一个参数视为字符串,只打印前三个字符 $ i=0; while [ $i -lt 9 ];do i=$((i+1)); sleep 0.1; \ printf "%d.%.3ss\n" `date +%S` `date +%N` ;done 33.917s 34.025s 34.133s 34.240s 34.348s 34.457s 34.566s 34.674s 34.784s
只需将前三个数字从纳秒中剪掉 printf%d.%.3ss\n日期+%S日期+%n顺便说一句,只运行一次日期可能不是非常不明智的 -打印一个数字,后跟一个点,然后将下一个参数视为字符串,只打印前三个字符 $ i=0; while [ $i -lt 9 ];do i=$((i+1)); sleep 0.1; \ printf "%d.%.3ss\n" `date +%S` `date +%N` ;done 33.917s 34.025s 34.133s 34.240s 34.348s 34.457s 34.566s 34.674s 34.784s 由于使用bc implie forks需要时间,我更喜欢这种纯bash解决方案:
start=$(date +%s%N);sleep 1.1;elapsed_time=$(($(date +%s%N) - start))
_Z9=000000000
[ ${#elapsed_time} -lt 9 ] && \
elapsed_time=${_Z9:0:9-${#elapsed_time}}$elapsed_time;
printf "%.3fs\n" ${elapsed_time:0:${#elapsed_time}-9
}.${elapsed_time:${#elapsed_time}-9}
打印:
1.107s
对于这类事情,我写了一点就可以了
工作很快就完成了
它可以在Linux/proc/timer_list上使用,也可以在Linux/proc/uptime或date+%s%n上使用,如果在其他系统上没有经过良好测试,欢迎反馈
它使用两个计数器,一个用于每次调用,另一个用作总计数器,并接受一些参数读取注释:
. elap.bash
elap -R ; for i in {1..10};do sleep .1; elap Counter $i;done;elap -t total
0.110488478 Counter 1
0.111014783 Counter 2
0.117158015 Counter 3
0.112897232 Counter 4
0.111928207 Counter 5
0.108822248 Counter 6
0.113464053 Counter 7
0.117487421 Counter 8
0.115716626 Counter 9
0.110493433 Counter 10
0.008513430 1.137983926 total
而且,由于bc可能很有用:
time echo 'scale=1000;pi=4*a(1);0'|bc -l
0
real 0m1.590s
user 0m0.768s
sys 0m0.008s
或
将此脚本与/proc/timer\u list一起使用可以执行以下操作:
elap -R ; for i in {1..10};do elap Counter $i;done;elap -t total
0.001299574 Counter 1
0.001574097 Counter 2
0.005771637 Counter 3
0.001428803 Counter 4
0.010423721 Counter 5
0.004037965 Counter 6
0.001392464 Counter 7
0.008092812 Counter 8
0.001634280 Counter 9
0.001365652 Counter 10
0.008201473 0.045222478 total
当同一个脚本无法访问/proc时,使用fork-to-date+%s%N给出:
在这种情况下,我们可以看到fork的成本接近1/100秒
好的,最后,为了匹配问题的精确格式,这个小脚本可以通过以下方式修补,对于示例:
eval "$(sed -e < elap.bash '
/6d/{ s/6d.%/10.3f/g;p;N;
:a;
s/^.*\n//g;N;s/" \\\n[ \t]*"/./; p;
s/^.*//g; N;/elaP_elap2/ba; }')"
elap -R ; for i in {1..10};do elap Counter $i;done;elap -t total
0.001s Counter 1
0.006s Counter 2
0.007s Counter 3
0.004s Counter 4
0.003s Counter 5
0.002s Counter 6
0.001s Counter 7
0.001s Counter 8
0.006s Counter 9
0.002s Counter 10
0.004s 0.038s total
38s total由于使用bc implie forks需要时间,我更喜欢这种纯bash解决方案:
start=$(date +%s%N);sleep 1.1;elapsed_time=$(($(date +%s%N) - start))
_Z9=000000000
[ ${#elapsed_time} -lt 9 ] && \
elapsed_time=${_Z9:0:9-${#elapsed_time}}$elapsed_time;
printf "%.3fs\n" ${elapsed_time:0:${#elapsed_time}-9
}.${elapsed_time:${#elapsed_time}-9}
打印:
1.107s
对于这类事情,我写了一点就可以了
工作很快就完成了
它可以在Linux/proc/timer_list上使用,也可以在Linux/proc/uptime或date+%s%n上使用,如果在其他系统上没有经过良好测试,欢迎反馈
它使用两个计数器,一个用于每次调用,另一个用作总计数器,并接受一些参数读取注释:
. elap.bash
elap -R ; for i in {1..10};do sleep .1; elap Counter $i;done;elap -t total
0.110488478 Counter 1
0.111014783 Counter 2
0.117158015 Counter 3
0.112897232 Counter 4
0.111928207 Counter 5
0.108822248 Counter 6
0.113464053 Counter 7
0.117487421 Counter 8
0.115716626 Counter 9
0.110493433 Counter 10
0.008513430 1.137983926 total
而且,由于bc可能很有用:
time echo 'scale=1000;pi=4*a(1);0'|bc -l
0
real 0m1.590s
user 0m0.768s
sys 0m0.008s
或
将此脚本与/proc/timer\u list一起使用可以执行以下操作:
elap -R ; for i in {1..10};do elap Counter $i;done;elap -t total
0.001299574 Counter 1
0.001574097 Counter 2
0.005771637 Counter 3
0.001428803 Counter 4
0.010423721 Counter 5
0.004037965 Counter 6
0.001392464 Counter 7
0.008092812 Counter 8
0.001634280 Counter 9
0.001365652 Counter 10
0.008201473 0.045222478 total
当同一个脚本无法访问/proc时,使用fork-to-date+%s%N给出:
在这种情况下,我们可以看到fork的成本接近1/100秒
好的,最后,为了匹配问题的精确格式,这个小脚本可以为sam修补
以这种方式:
eval "$(sed -e < elap.bash '
/6d/{ s/6d.%/10.3f/g;p;N;
:a;
s/^.*\n//g;N;s/" \\\n[ \t]*"/./; p;
s/^.*//g; N;/elaP_elap2/ba; }')"
elap -R ; for i in {1..10};do elap Counter $i;done;elap -t total
0.001s Counter 1
0.006s Counter 2
0.007s Counter 3
0.004s Counter 4
0.003s Counter 5
0.002s Counter 6
0.001s Counter 7
0.001s Counter 8
0.006s Counter 9
0.002s Counter 10
0.004s 0.038s total
38s总计也许您可以使用time命令?时间是一个很好的选择!也许你可以使用时间命令?时间是一个很好的选择!如果经过的_时间大约为1,则这将不起作用。或者100..你控制变量。问题在哪里?此外,将点之前的内容与点之后的内容区分开来也很简单。无论如何,bc解决方案更具可读性,只需使用它。如果所用的时间大约为1,这将不起作用。或者100..你控制变量。问题在哪里?此外,将点之前的内容与点之后的内容区分开来也很简单。无论如何,bc解决方案更具可读性,只需使用它即可。