我正在以三种不同的方式将一些输出重定向到文件,并且每个输出都占用明显不同的时间.
$>/tmp/file ; time for i in {1..1000}; do for j in {1..1000}; do echo $i $j >> /tmp/file; done; done
real 0m33.467s
user 0m21.170s
sys 0m11.919s
$>/tmp/file ; exec 3>/tmp/file; time for i in {1..1000}; do for j in {1..1000}; do echo $i $j >&3; done; done; exec 3>&-
real 0m24.211s
user 0m17.181s
sys 0m7.002s
$>/tmp/file ; time for i in {1..1000}; do for j in {1..1000}; do echo $i $j; done; done >> /tmp/file
real 0m17.038s
user 0m13.072s
sys 0m3.945s
有人可以解释这里的差异.我目前的理解/怀疑是:
> 1st是最慢的,因为它多次打开/关闭文件而其他人只执行一次.是对的吗?怎么样缓冲.通常情况下,我希望所有输出都得到缓冲,在这种情况下我们不应该有这么大的时间差.
>在第3个中,如果所有输出仅在外部循环的末尾写入,则在循环仍在执行时存储的所有输出都在哪里.也许在记忆中.这是否意味着如果我回应很多东西并且只在最后写,我会耗尽内存.
>第二名更像第一名或第三名.为什么它与两者都如此不同.
PS:我已经运行了上述命令几次,发现时间是一致的.所以,我看到的差异必然是由于一些真正的原因.