【问题标题】:Perl: eval string performance issuePerl:评估字符串性能问题
【发布时间】:2013-09-15 08:59:07
【问题描述】:

在我的 Web 应用程序中,我使用以下代码在运行时动态加载模块,但看起来它需要花费大量时间,这会使应用程序变慢。

eval {
    eval "require $package_name";
}
if ($@) {
    die"Error while loading module: $@\n";
}

我做了一个小程序来检查eval "require $package_name";这段代码平均需要多少时间,然后我发现它需要将近10秒,这对于Web应用程序来说是巨大的。

use strict;
use Time::HiRes qw( gettimeofday tv_interval );

my $startTime = [ gettimeofday() ];
print "Time:@{$startTime}->[0]\n";

eval "require Foo::Bar"; # giving example

my $timeSpent = tv_interval( $startTime, [ gettimeofday() ] );
print "Time Spent:$timeSpent\n";

exit 1;

输出:

Time:1378897304
Time Spent:10.627147

所以我的问题是,为什么这要花这么多时间,有没有其他方法可以解决这个问题?

【问题讨论】:

  • 这很可能不是string-eval的问题。仅require Foo::Bar 没有eval 可能会花费相同的时间。
  • 对,但我仍然想知道为什么要花这么多时间。
  • 也许 Foo::Bar 需要一半的 CPAN?或者一些昂贵的计算是在函数之外的 Foo::Bar 中完成的?
  • 顺便说一句,第一段中的双重评估是无用的。这里只有 string-eval 就足够了。

标签: perl eval require


【解决方案1】:

是的。

使用 apache 和 mod_perl 并在启动时加载模块。

http://www.conceptsolutionsbc.com/perl-articles-mainmenu-41/29-perl-and-apache/55-modperl-part-2-pre-loading-perl-modules

我认为最好的方法是使用一个非常简单的脚本,它只需要你所有使用过的模块:

PerlRequire "/usr/local/apache2/conf/startup.pl" 

【讨论】:

  • 感谢您的回答。我已经在使用 apache 和 mod_perl 但我无法在启动时加载模块,因为模块在运行时动态出现。考虑这段代码被许多应用程序使用的情况,并且每个应用程序的模块名称都不同。
猜你喜欢
  • 2012-08-08
  • 1970-01-01
  • 2013-07-24
  • 1970-01-01
  • 1970-01-01
  • 2016-08-29
  • 1970-01-01
  • 2020-04-20
  • 2011-05-08
相关资源
最近更新 更多