Perl日記

日々の知ったことのメモなどです。Perlは最近やってないです。

コンパイル時にリテラルだと最適化してくれる組み込み関数

length('rightgo09')みたいにすると、コンパイルの時点で9にしてくれていることを知った。

my $len = length('rightgo09');
$ perl -MO=Deparse len.pl 
my $len = 9;
len.pl syntax OK

演算結果なんかはしていると聞いてたけど、関数でもなるのかーへーと思って他でもやってみた。
http://perldoc.perl.org/perlfunc.html

最適化する 最適化しない
chr, crypt, hex, lc, lcfirst, length, oct, ord, sprintf, uc, ucfirst, quotemeta, abs, atan2, cos, exp, hex, int, log, oct, sin, sqrt index, pack, reverse, rindex, substr, m/()/, split, rand

grepとかjoinとかはできるかもと思ったが配列操作関係は全部実行時にしているみたい。
あとuse constant XXX;するとコンパイル時に置き換わるだけなので上記の最適化対象になる。




蛇足:以下のような感じで確かめてた。

substr
my $cut = substr('rightgo09', 1, 2);
$ perl -MO=Deparse substr.pl 
my $cut = substr('rightgo09', 1, 2);
substr.pl syntax OK

だめだた。

chr
my $char = chr(65);
$ perl -MO=Deparse chr.pl 
my $char = 'A';
chr.pl syntax OK

できた。