我正在以三种不同的方式将一些输出重定向到文件,并且每种方式都需要明显不同的时间。
$ >/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
有人可以在这里解释差异。我目前的理解/怀疑是:
- 第一个是最慢的,因为它多次打开/关闭文件,而其他只做一次。是对的吗?缓冲呢。通常,我希望所有输出都得到缓冲,在这种情况下我们不应该有这么大的时间差异。
- 第三,如果所有输出都只写在外循环的末尾,那么当循环仍在执行时,所有输出都存储在哪里。也许在记忆中。这是否意味着如果我回显很多内容并且只在最后写入,我可能会耗尽内存。
- 第 2 次更像第 1 次或第 3 次。为什么两者都如此不同。
PS:我已经运行了几次上述命令,发现时间是一致的。所以,我看到的差异一定是由于一些真正的原因。