带DDEBUGGING编译选项的Perl运行速度是否会变慢?
关于Debian Perl中
-DDEBUGGING=-g参数的性能影响说明 首先直接给结论:你在Debian系统perl -V输出里看到的-DDEBUGGING=-g编译参数,不会导致Perl运行速度下降,和Daina Pettit在《Supercharging Perl》演讲里提醒避开的-DDEBUGGING选项不是同一个东西,不要混淆。
两类同名参数的核心区别
- 你看到的
-DDEBUGGING=-g是传给C编译器的参数,作用仅仅是在Perl二进制文件中嵌入C源码级别的调试符号(行号、变量名等),方便coredump时用gdb定位问题,不会改动Perl解释器的任何执行逻辑,对Perl代码运行效率没有可感知的影响。 - 演讲中提到的会拖慢性能的
-DDEBUGGING,是Perl源码Configure构建阶段的顶层开关,也就是执行./Configure -DDEBUGGING时开启的内部调试模式:这个模式会打开Perl解释器内部全量的opcode执行断言、内存越界校验、执行流追踪逻辑,这类检查会嵌入到每一个Perl指令的运行流程中,通常会让脚本整体运行速度下降30%~50%,除非你要调试Perl解释器本身的bug,否则确实不建议生产环境使用。
如何确认当前Perl是否开启了影响性能的内部调试模式
直接执行如下命令即可确认,不要靠perl -V里的ccflags参数瞎猜:
perl -MConfig -e 'print $Config{DEBUGGING}'
- 输出为
define:说明当前Perl开启了内部调试校验,属于演讲中提到的性能受损版本 - 输出为
none或空值:说明是正常的性能优化构建版本,哪怕ccflags里带-DDEBUGGING=-g也完全不影响运行速度
补充说明线程编译选项的性能影响
多数主流Linux发行版的默认Perl包确实会编译启用ithreads线程支持,这个选项会带来大概10%~15%左右的性能开销,如果你完全不使用线程相关功能,追求极致性能可以自行编译关闭ithreads、关闭内部DEBUGGING的定制版本,但普通业务场景下发行版默认构建的Perl性能完全够用,没有特殊需求没必要特意替换。
内容的提问来源于stack exchange,提问作者Evan Carroll
相关产品推荐
相关产品推荐

