【发布时间】:2021-03-29 16:48:11
【问题描述】:
我正在尝试将我的代码中的一些 use 语句切换到 require 用于仅在满足某些条件时才使用的模块(例如,程序可能在需要这些模块的时间之间加载 1,000 次),以便降低开销并提高我的程序的执行速度(我一直在使用 Devel::NYTProf 来分析我的代码,并且即使我在某个会话中没有使用它们,一些模块也会增加显着的执行时间)。
我遇到了一个问题,即脚本在加载时终止,因为未定义符号(在导入该模块之前不会定义符号)。有没有办法告诉 Perl 符号将在运行时导入?一个简单的例子:如果我调用一个触发它的例程,我只想使用 Data::Dumper:
sub dataDumper {
require Data::Dumper;
Data::Dumper->import;
say STDERR Dumper @_;
}
但是,在第三行调用 Dumper 会导致异常。我可以通过参考Data::Dumper->Dump 来解决这个问题。然而,与 LWP::UserAgent 类似的问题证明有点麻烦,因为 LWP::UserAgent 导入 HTTP::Request。我还没有想出避免抛出异常的my $request = new HTTP::Request GET => $params->{'url'}; 的变体。
假设我可以这样做,有什么理由说明这种方法是个坏主意吗?由于在编译时不加载这些模块,我是否会失去任何类型的优化?在像 LWP 这样的模块上,这似乎是一个简单的调用——我只是不怎么使用它。我对是否尝试在(例如)Text::Textile 和 Text::MultiMarkdown 之间动态切换有点困惑(我通常每次执行只需要一个。
【问题讨论】:
-
如果启动时间如此繁重,可能值得研究一个持久化服务(就像 FCGI 之于 CGI)。
-
@ikegami 这听起来很有趣。您是否可以推荐一个很好的指南来使用现有程序并使用持久系统来实现它?听起来 PSGI 是今天最好的路线?
-
对不起,没有。 . . . .
标签: perl