Perl:eval字符串性能问题

Perl:eval字符串性能问题,perl,eval,require,Perl,Eval,Require,在我的Web应用程序中,我使用下面的代码在运行时动态加载模块,但这似乎花费了很长时间,使应用程序稍微慢了一点 eval { eval "require $package_name"; } if ($@) { die"Error while loading module: $@\n"; } 我制作了一个小程序来检查eval“require$package\u name”这段代码平均花费了多少时间,然后我发现它花费了将近10秒,这对于web应用程序来说是巨大的 use strict

在我的Web应用程序中,我使用下面的代码在运行时动态加载模块,但这似乎花费了很长时间,使应用程序稍微慢了一点

eval {
    eval "require $package_name";
}
if ($@) {
    die"Error while loading module: $@\n";
}
我制作了一个小程序来检查
eval“require$package\u 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
所以我的问题是,为什么要花这么多时间,有没有其他办法来解决这个问题?

是的,是的

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

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

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

谢谢你的回答。我已经在使用apache&mod_perl,但我无法在启动时加载模块,因为模块在运行时是动态的。考虑这种代码被许多应用程序使用的情况,并且对于每个应用程序模块的名称是不同的。这很可能不是字符串->代码> EVA/COD>的问题。仅仅
require Foo::Bar
而不使用
eval
可能会花费相同的时间。对,但我仍然想知道为什么这会花费这么多时间。也许Foo::Bar本身需要一半的CPAN?或者一些昂贵的计算是在函数之外的Foo::Bar中完成的?顺便说一句,第一段中的双重求值是无用的。这里只有字符串eval就足够了。