我将要重写我在过去10年中开发的大部分项目,同时学习perl。可以获得很多优化。
代码的一个关键部分是一个大的if / elsif块,它需要xxx.cgi文件,具体取决于POST值。例如:
if($FORM{'action'} eq "1"){require "1.cgi";}
elsif($FORM{'action'} eq "2"){require "2.cgi";}
elsif($FORM{'action'} eq "3"){require "3.cgi";}
elsif($FORM{'action'} eq "4"){require "4.cgi";}
它有更多的烦恼,但在perl中使用“require”有多昂贵?
答案 0 :(得分:4)
require
本身的成本相对较低,如果您在程序的单次运行中多次require
同一个文件,它将检测到该文件已被加载而不是第二次尝试加载它。但是,如果您有一个漫长且高度填充的搜索路径(@INC
)和require
(或use
)很多文件,那么所有目录搜索都可能会添加起来;这种情况并不常见(在您的情况下听起来不太可能),但可以通过重新组织模块目录来改进它,以便您加载的内容在@INC
中更早出现。
早期答案中提到的潜在主要性能影响是编译require
文件中代码的成本。通过将代码移动到主程序中来摆脱require
将不会帮助解决这个问题,因为代码仍然需要编译。在您的情况下,它可能会使事情变得更糟,因为它会导致所有选项的代码在每个选项上编译,而不是仅编译用户选择的一个操作所使用的代码。
答案 1 :(得分:3)
如前所述,它实际上取决于这些文件中的实际代码。您最好的选择是使用Devel::NYTProf和/或Benchmark进行测试,看看如果您对其效果不满意,您的代码花费的时间最多。
您还可以阅读Profiling Perl on perl.com,但因使用Devel::DProf而有点过时。
答案 2 :(得分:1)
不回答您的主要问题,但我最近在Ovid blog阅读的代码重构仍然是一个好主意。
答案 3 :(得分:0)
第一次,可能很贵; Perl必须搜索路径才能找到该文件并加载它。随后的时间,它很便宜 - 咨询一个表,第二次实际上没有加载文件。如果这是在每个请求运行一次然后退出的CGI中,那么这不太好。
答案 4 :(得分:0)
这实际上取决于您要调用的文件的大小。如果您有大量的CGI文件,那么它可能会损害您的软件性能。如果我们每个都在谈论6或7行代码,那么没问题。尝试使用和不使用基准测试程序的性能,并做出自己的判断。