我一直在探索编译 Perl 程序,以此来改善复杂 Perl CGI 程序的初始启动时间。@Rurban 的详细概述对我很有帮助。编译我的主进程脚本使用perlcc -o launcher launcher.fpl
. 由此产生的过程至少快 20% - 不是压倒性的,但仍然有意义。
为什么我要编译而不是简单地进一步优化? 我花了几个月的时间Devel::NYTProf
来捕捉低效的代码,所以我相信我已经攻击了大部分低效的优化成果。代码很快,一旦加载,它通过mod_fcgi
FastCGI 运行,所以它保持持久加载。但是,如果它发生崩溃或者如果 FastCGI 需要生成一个新进程(或者因为前一个进程已经达到其最大请求级别,或者有足够的需求需要另一个工作人员),那么缓慢的加载时间就会引起它的丑陋。新进程的第一个请求可能需要 1-1.5 秒,而后续请求的时间不到 200 毫秒。
问题:很多程序都是 Perl 模块的形式,核心“加载器”根据它正在做的事情动态加载。例如,为我的网站首页加载的模块是最慢的模块之一。因此,按理说,一些最重要的优化将来自编译这些模块。但是,同时使用perlcc -B Front.pm -o Front.pmc
andperl -c Front.pm
时,当我尝试运行程序时会遇到无用的段错误:
[root@server code]# ./launcher.fpl
Segmentation fault (core dumped)
编译过程不提供提示问题的调试消息。(要清楚:为了简单起见,在这个例子中,launcher.fpl没有编译,只是简单的 Perl。)如果我删除 pmc 文件,以便 launcher.fpl 可以再次加载未编译的模块,它加载时不会出错。
我也试过:
perl -MO=Bytecode,-m,-oFront.pmc Front.pm
这似乎工作得稍微好一些,但是当我尝试运行程序时会产生这个错误:
[root@server cgi-bin]# ./launcher.fpl
Number found where operator expected at /home/user/www/cgi-bin/Front.pm line 1, near "multi0.12"
Local: Sat Jul 10 14:58:18 2021: Dying from error.; At file: /home/user/www/cgi-bin/Front.pm; line: 1; id:
Error: Unrecognized character \x08; marked by <-- HERE after ulti<-- HERE near column 36 at /home/user/www/cgi-bin/Front.pm line 1.
Compilation failed in require at /home/user/www/cgi-bin/Loader.pm line 117.
Loader.pm 第 117 行是需要 Front.pm(c) 模块的地方:
state $moduleFront = require Front;
这导致了两个主要问题:(1)我是否以正确的方式开始以及(2)如果我没有完全走错路,有没有办法调试为什么我的模块在编译时会出现段错误?