Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 用三个尾随数字以秒为单位打印经过的时间_Bash - Fatal编程技术网

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)) 这一切都很好,似乎很有效,但真正

对于我正在编写的框架,我想测量一段bash代码执行所需的时间,然后以秒为单位打印所用的时间

对于测量,我执行以下操作:

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解决方案更具可读性,只需使用它即可。