我想知道您是否有任何提高Perl脚本性能性能的基本技巧(如记忆确定函数)?
答案 0 :(得分:12)
Devel::NYTProf
perl -d:NYTProf some_perl.pl
nytprofhtml -f nytprof
firefox nytprof/index.html
O(n
2
)
算法,其中O(n)
算法也可以吗?)Benchmark
来比较它们(请记住使用您希望在野外看到的数据,某些算法对于少量项目会很好,但是当项目数量增加时会很糟糕)答案 1 :(得分:7)
你应该先做个人资料。规则被打破。
一些非常基本的提示:
答案 2 :(得分:6)
提高Perl脚本性能的基本技巧包括适用于所有地方的一般方法,以及一些特定于Perl的内容。
类似的事情:
这不是一个很容易被简单回答的东西。
我会给一条一条建议。提高代码性能的最佳方法是在SO上发布它的特定位,并等待brian d foy之类的内容找到它: - )
答案 3 :(得分:4)
我最近发现分析非常有用,并且Devel::NYTProf非常擅长。分析会阻止您进行不必要的优化,并帮助您首先解决最大的瓶颈。
当然,了解不要做什么有帮助,但猜测那不是特定的perl ..
虽然常见的perl性能问题列表很不错:)
<强>更新强>
这里有一个:如果你不另外说明,glob()会排序:|
不要复制大量数据,请使用引用(例如:Use scalar references to pass large data without copying.)
答案 4 :(得分:4)
这里有许多好的建议,这里还有一些:
pack
和unpack
非常快,但split
有时更快sub{\@_}->(retuns_a_list())
比[returns_a_list()]
快40%左右(您不必内联子程序,我通常称之为sub cap {\@_}
(捕获的简称)如果你真的需要提高某些对象的方法调用速度,你可以使用基于闭包的对象。以下是我的模块List::Gen的一段摘录,讨论了创建闭包对象的curse
方法:
诅咒HASHREF PACKAGE
此程序包中的许多函数都使用闭包对象,以避免在每次访问期间解除引用其对象中字段的速度。诅咒类似于祝福这些物品,虽然祝福引用现有包的成员,但是诅咒会让人想起一个新的包来进行参考的出价
package Closure::Object;
sub new {
my ($class, $name, $value) = @_;
curse {
get => sub {$value},
set => sub {$value = $_[1]},
name => sub {$name},
} => $class
}
Closure :: Object在功能上等同于以下普通的perl对象,但是由于没有哈希查找或其他解引用(对于短getter / setter类型方法,快40-50%),所以方法调用更快。
package Normal::Object;
sub new {
my ($class, $name, $value) = @_;
bless {
name => $name,
value => $value,
} => $class
}
sub get {$_[0]{value}}
sub set {$_[0]{value} = $_[1]}
sub name {$_[0]{name}}
折扣是在创造时间/记忆中,因为任何好的诅咒都需要在无辜的包裹的血液中画出至少几个五角星。返回的对象被祝福到变形包中,该变换包继承自提供的PACKAGE。
当fast is不够快时,由于大多数被诅咒的方法不需要传递给它们的对象,所以调用该方法的最快方法是:
my $obj = Closure::Object->new('tim', 3);
my $set = $obj->{set}; # fetch the closure
# or $obj->can('set')
$set->(undef, $_) for 1 .. 1_000_000; # call without first arg
比使用简短的getter / setter方法从普通对象预缓存方法快约70%。
答案 5 :(得分:3)
这个问题让我想起advice of Tim Bunce,Devel::NYTProf
的维护者。
总结一下,除非你真的需要,否则不要这样做。
我最喜欢引用他的演讲:
“计划的第一条规则” 优化:不要这样做。
程序优化的第二条规则(仅供专家使用!):不要尚未。“
[强调添加]
答案 6 :(得分:2)