首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Shell重定向和文件I/O持续时间

Shell重定向和文件I/O持续时间
EN

Stack Overflow用户
提问于 2012-11-26 18:20:42
回答 1查看 300关注 0票数 6

我正以三种不同的方式将一些输出重定向到一个文件,每一种方式都花费了明显不同的时间。

代码语言:javascript
复制
$ >/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

有人能解释一下这里的区别吗。我目前的理解/怀疑是:

  1. 第一是最慢的,因为它打开/关闭文件多次,而其他人只做一次。是那么回事吗?缓冲呢。通常,我希望所有的输出都会被缓冲,在这种情况下,我们不应该有这么大的时间差异。
  2. 第三,如果所有输出只写在外部循环的末尾,那么当循环仍在执行时,存储的所有输出都在哪里。也许在记忆中。这是否意味着,如果我回音了很多东西,并且只在结尾写的话,我的记忆就会耗尽。
  3. 第二更像第一或第三。为什么它和任何一种都不一样。

PS:我已经运行了上述命令几次,发现时间是一致的。所以,我所看到的差异肯定是由于一些真正的原因。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-01 12:32:08

  1. 第一个版本执行了一百万次echo $i $j >> /tmp/file,它打开文件以供追加、写入并关闭它。
  2. 执行一百万次echo $i $j >&3不同于每次打开/关闭文件,而是写入文件描述符#3。exec 3>/tmp/file打开文件以写入文件,并将文件描述符保存为#3。当命令的stdout重定向到文件描述符#3 (回显后的>&3的效果)时,shell需要在执行命令之前设置此重定向,然后将以前的赋值恢复为stdout。
  3. 像这样重定向完整循环的输出对于>> /tmp/file来说要容易得多:它可以简单地执行回显命令,而不需要设置额外的文件描述符。它只改变一次stdout的分配。

关于缓冲:在所有三种情况下,底层文件系统都会缓冲对物理文件的访问,因此在这个级别上没有区别。而且,大多数linuxes都在/tmp上挂载了tmpfs,这使得您所做的一切都是纯内存操作。因此,这里不是测量IO-性能,而是shell命令执行性能。您可以通过增加写入的字节数来证明这一点(将一个常量值添加到回显打印中):

代码语言:javascript
复制
>/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“的时间相同,但将两倍的字节写入文件。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13570803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档