我正在以三种不同的方式将一些输出重定向到文件,并且每个输出都占用明显不同的时间.
$>/tmp/file ; time for i in {1..1000}; do for j in {1..1000}; do echo $i $j >> /tmp/file; done; donereal 0m33.467suser 0m21.170ssys 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.211suser 0m17.181ssys 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.038suser 0m13.072ssys 0m3.945s
有人可以解释这里的差异.我目前的理解/怀疑是:
> 1st是最慢的,因为它多次打开/关闭文件而其他人只执行一次.是对的吗?怎么样缓冲.通常情况下,我希望所有输出都得到缓冲,在这种情况下我们不应该有这么大的时间差.
>在第3个中,如果所有输出仅在外部循环的末尾写入,则在循环仍在执行时存储的所有输出都在哪里.也许在记忆中.这是否意味着如果我回应很多东西并且只在最后写,我会耗尽内存.
>第二名更像第一名或第三名.为什么它与两者都如此不同.
PS:我已经运行了上述命令几次,发现时间是一致的.所以,我看到的差异必然是由于一些真正的原因.最佳答案>第一个版本的回声是$i $j>>的百万倍. / tmp / file,打开要追加的文件,写入并关闭它.
>做一百万次echo $i $j>& 3的不同之处在于它不会每次都打开/关闭文件,而是写入文件描述符#3. exec 3> / tmp / file打开文件进行写入,并将文件描述符保存为#3.现在,当命令将其stdout重定向到文件描述符#3(回声后>& 3的效果)时,shell需要在执行命令之前设置此重定向,然后将之前的赋值恢复为stdout.
>重定向完整循环的输出,如下所示>> / tmp / file对于shell来说要容易得多:它可以简单地执行echo命令而无需设置其他文件描述符.它只改变了一次stdout的赋值.
关于缓冲:在所有三种情况下,底层文件系统将缓冲对物理文件的访问,因此在该级别上没有差异.此外,大多数linux都在/ tmp上安装了一个tmpfs,无论如何都会让你做一切纯内存 *** 作.所以你不是在这里测量IO性能而是测试shell命令执行性能.您可以通过增加写入的字节数来证明这一点(向行回显打印添加一个常量值):
>/tmp/file ; time for i in {1..1000}; do for j in {1..1000}; do echo "1000000 $i $j" >> /tmp/file; done; done>/tmp/file ; exec 3>/tmp/file; time for i in {1..1000}; do for j in {1..1000}; do echo "1000000 $i $j" >&3; done; done; exec 3>&->/tmp/file ; time for i in {1..1000}; do for j in {1..1000}; do echo "1000000 $i $j"; done; done >> /tmp/file
在我的PC上,这与没有常量“1000000”的情况相同,但是向文件写入两倍的字节. 总结
以上是内存溢出为你收集整理的linux – Shell重定向和文件I / O持续时间全部内容,希望文章能够帮你解决linux – Shell重定向和文件I / O持续时间所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)