【发布时间】:2020-02-15 04:00:22
【问题描述】:
当从 Perl 脚本调用外部程序时,Capture::Tiny 是否避免了使用 system() 时需要的磁盘 io?使用任何一种时,我都能获得基本相同的性能。一位同事正在使用我的代码并告诉我它正在敲打他的磁盘。在本地机器上运行并写入本地磁盘时,我(也许)没有这个问题。
我以前是这样做的:
open($fhStdin, ">stdin.txt");
print $fhStdin "some text\n";
close($fhStdin);
system("cmd < stdin.txt 1> stdout.txt 2> stderr.txt");
# open and read stdout.txt
# open and read stderr.txt
然后改成这样:
($stdout, $stderr, $exit) = capture {
open($fhStdin, '| cmd');
print $fhStdin "some text\n";
close($fhStdin);
};
但 NYTProf 告诉我,它们运行所需的时间基本相同(但 NYTProf 从子例程时间中消除了磁盘 io 开销)。所以我想知道 capture() 是否正在写入引擎盖下的临时文件? (我尝试阅读 Tiny.pm 源代码,但很惭愧地说我无法从中看出。)
感谢任何提示。
【问题讨论】:
-
一般来说,您的 Capture::Tiny 实现会减少 IO。它不是读写磁盘。很奇怪。
-
轻微错字...应该是'system("cmd stdout.txt 2> stderr.txt")',对不起。
-
这两个代码 sn-ps 的行为不同。在第一种情况下,您让 shell 从您第一次编写的文件中管理对
cmd的输入,在第二种情况下,您正在向它提供输入……如何?你能展示一下# write cmd input to $fh的进展情况吗(简而言之)?就目前而言,我不明白为什么它会导致 more 磁盘访问。 -
@zdim 在第一种情况下,我将外部程序期望的文本打印到文件中,然后让外壳程序将其传递给 cmd 的标准输入(如您所说)。在第二种情况下,我打开一个到 cmd 的管道,从而将相同的文本直接打印到 cmd 的标准输入。 (即避免我的脚本需要编写中间文件。)抱歉,如果不清楚,我已经编辑了我的帖子以(希望)改进这一点。