【发布时间】: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 就足够了。