说实话,Perl本身不慢。
慢的是你不会用。
很多人写Perl,上来就是一堆模块,一堆循环,一堆正则。
然后抱怨:这破语言也太慢了吧。
其实,换个写法,速度能提升好几倍。
很多人写Perl,开头就是:
use strict;
use warnings;
use CGI;
use DBI;
use LWP;
use JSON;
use XML::Simple;
大哥,你用得完吗?
用不完就别加载。
use CGI ();
use DBI ();
只加载你要用的函数。
要不就采用require, 在需要运用它的那个时候, 再去进行加载。
sub get_db {
require DBI;
# 连接数据库
}
这样,程序启动快得多。
use autouse 'CGI' => qw(param header);
仅当用到param的时候, 才加载CGI模块, 并且仅当用到header的时候, 才加载CGI模块。
Perl自带了很多函数。
比如排序,别自己写冒泡排序。
my @sorted = sort { $a <=> $b } @array;
系统函数是用C写的,比你自己写快一百倍。
my @result = map { $_ 2 } grep { $_ > 10 } @array;
一行搞定,还快。
my $data = pack 'N', @numbers;
比你自己拼字符串快多了。
别写复杂的正则。
拆成多个简单的。
# 慢
if ($text =~ /^(?:foo|bar|baz)/) { ... }
# 快
if ($text =~ /^foo/ || $text =~ /^bar/ || $text =~ /^baz/) { ... }
XS是Perl的扩展接口。
用C写核心代码,Perl调用。
速度直接起飞。
大量计算
频繁调用
处理大数据
太麻烦。
用Inline::C。
use Inline C => <<'END_C';
int add(int a, int b) {
return a + b;
}
END_C
print add(3, 4); # 7
简单粗暴。
比如List::Util。
use List::Util qw(sum max min shuffle);
这些都是C写的,快。
别用那些大而全的模块。
自己写个简单的。
package My::Fast::Math;
use strict;
use warnings;
sub add {
my ($a, $b) = @_;
return $a + $b;
}
1;
不用加载一堆依赖。

我有个朋友,写了个日志分析程序。
一开始用CGI模块,加载就花了2秒。
后来改成:
use CGI::Minimal;
启动时间降到0.1秒。
另一个朋友,处理10万行数据。
用纯Perl循环,跑了30秒。
用以List::Util的reduce来进行替换, 三秒钟便能够完成搞定。
Perl性能优化,没那么玄乎。
记住三点:
少加载模块
多用系统函数
关键部分用C
就这么简单。
别把Perl当Java写。
别把Perl当Python写。
Perl就是Perl,有它自己的脾气。
顺着它,它就快。
逆着它,它就慢。
试试吧,保证有效。