【问题标题】:Why does perl execute a command take longer than running the command alone?为什么 perl 执行命令比单独运行命令花费更长的时间?
【发布时间】:2018-09-26 08:06:44
【问题描述】:

当我运行命令时

montage -background black -geometry +0+0 -mode Unframe -tile ${num_digits}x1 $filelist gif:- > ~/temp/count.gif

执行需要0.1秒(我用time montage...)。

当我将该命令放入我的 perl cgi 脚本时

print LOG "starting montage\n";
open(GRFX,
    "montage -background black -geometry +0+0 -mode Unframe -tile ${num_digits}x1 $filelist gif:- |"
);
print LOG "finish montage\n";
print <GRFX>;
print LOG "finish output\n";
close(GRFX);

“完成蒙太奇”和“完成输出”之间的时间是6秒!!

如果我从命令行运行 cgi 脚本需要 0.1 秒。但是从 Apache 内部需要 6 秒,即使使用与 Apache 位于同一台计算机上的浏览器访问也是如此(所以不是互联网减慢速度,而且,无论浏览器是否在同一台计算机上,所有其他页面加载速度都很快)。

蒙太奇生成的gif文件大小为1.7k。

任何想法为什么在 Apache 中运行时会如此缓慢?

唯一的头输出是print "Content-type: image/gif\n\n";

【问题讨论】:

  • 请投反对票的人解释一下投反对票吗?对我来说似乎是个好问题。

标签: apache perl


【解决方案1】:

您正在使用print &lt;GRFX&gt;; 打印输出,从管道shell 命令读取所有输出行。

LINES 是这里的关键词。大概,字节的尾随序列不会以换行符结束,因此 Perl 正在等待它。最终,它会超时。

您可以将local $/ = 4096 设置为一次读取 4096 字节的块。然后,使用print while &lt;GRFX&gt; 输出。

binmode 同时GRFXSTDOUT 也是一种很好的形式,这样你就不会被problems like this 所困扰。另请参阅我的 blog post related question

我很想像这样重写你的代码(未经测试):

sub output_image {
    my $num_digits = shift;
    my $filelist = shift;

    print LOG "starting montage\n";

    my @cmd = (
        montage => qw(
        -background black
        -geometry +0+0
        -mode Unframe
        -tile),
        "${num_digits}x1",
        split(/ /,$filelist),
        'gif:-'
    );

    open my $GRFX, '-|', @cmd
        or die "Failed to open pipe: $!";

    {
        local $/ = 4096;
        binmode $GRFX;
        binmode STDOUT;
        print while <$GRFX>;
    }

    close $GRFX
        or die "Failed to close pipe: $!";

    print LOG "finish montage\n";
}

【讨论】:

  • 非常感谢您的回答!它有很多我认为是相关的点,但最后,代码仍然需要 6 秒。我将您的代码按原样粘贴到我的计数器中,调用子程序代替我的代码来创建蒙太奇,修复了没有正确传递图像参数的一行,并计时为 6 秒。
  • 不客气。如果有机会,我会尝试复制您在 Linux 上看到的内容,如果发现任何问题,我会更新我的答案。
猜你喜欢
  • 2020-09-14
  • 1970-01-01
  • 2021-04-29
  • 2011-05-22
  • 1970-01-01
  • 2011-05-05
  • 2017-06-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多