之间是否有很大的性能差异:
我很想知道Windows和* nix的答案是什么。
编辑:我应该问:缓冲区缓存是否消除了临时文件和管道之间的区别?
答案 0 :(得分:31)
一个很大的区别是,使用管道,进程A和B可以同时运行,这样B可以在A完成生成之前处理A的输出。此外,管道的尺寸是有限的,因此A将不能产生比B消耗的数据多得多的数据;它会等待B赶上来。
如果数据量很大,则写入临时文件涉及磁盘活动,即使仅用于创建然后销毁文件。数据可能会保留在内存缓冲池中 - 因此没有磁盘I / O - 即使是令人惊讶的大文件。写入管道“从不”涉及写入磁盘。
答案 1 :(得分:9)
最大的区别在于第一种方法实际上使用磁盘存储,而管道将使用内存(除非你真的很迂腐并开始考虑交换空间)。
性能方面,内存比磁盘快(几乎总是如此)。对于所有操作系统,这通常应该是正确的。
使用临时文件的唯一时间确实有意义,即进程B必须检查多次传递中的数据(如某些类型的视频编码)。对于这种用途,需要缓冲整个数据流,如果有足够的数据,则可能会否定内存中的优势。因此,对于多次传递(搜索绑定)操作,请使用临时文件。
答案 2 :(得分:2)
除非我完全了解管道,否则答案是肯定的。
写入临时文件涉及磁盘访问和相关的开销。
写入管道并从中读取,发生在内存中。快得多。
答案 3 :(得分:0)
我认为实际的答案可能有所帮助。我正在快速优化我使用的脚本,它有大约4个步骤。我把它设置为使用管道和非管道方法。这是在Windows 7 64位下。
我没有使用滚边减速3%。对我来说这是值得的,因为现在我可以在每一步之间停下来并更新窗口标题,当它只是一个命令时我无法做到。
就个人而言,我会对窗口标题采取3%的命中率。
为了好奇,我正在使用> 20M文件,然后将其传递给修改结果的专用perl脚本,然后使用SORT.EXE中内置的窗口对它们进行排序,然后使用cygwin&#39来对它们进行排序。 ; s UNIQ.EXE,然后重新利用这些相同的结果来获得基于ANSI的grep-result-coloring。大部分时间都花在分拣阶段。