Blog

[perl] !!1 と 1 ではパフォーマンスに差がでるのか

一般的なインタプリタでは定数の畳み込み最適化が行われるため、プリミティブにたいする演算は最適化されます。

% perl -MO=Terse -e 'print !!1'
LISTOP (0x23860d8) leave [1]
    OP (0x2386070) enter
    COP (0x2386120) nextstate
    LISTOP (0x2386180) print
        OP (0x23861c8) pushmark
        SVOP (0x2386208) const  SPECIAL (0x2) sv_yes
-e syntax OK

% perl -MO=Terse -e 'print 1'
LISTOP (0x12a70e0) leave [1]
    OP (0x12a70a8) enter
    COP (0x12a7128) nextstate
    LISTOP (0x12a71c0) print
        OP (0x12a7188) pushmark
        SVOP (0x12a7208) const  IV (0x129dbf8) 1
-e syntax OK

結論としては、!!1 でも 1 でもパフォーマンスにはかわりありません。

% perl -MO=Terse -e 'print 1+2+3+4+5+6+7+8+9+102'
LISTOP (0x14d5080) leave [1]
    OP (0x14d5218) enter
    COP (0x14d50e8) nextstate
    LISTOP (0x14d5148) print
        OP (0x14d51d8) pushmark
        SVOP (0x14d5190) const  IV (0x14cbbf0) 147
-e syntax OK

なんなら、1から10までたしても実行時のパフォーマンスには差がありません。

なお、!!1 のような評価は、boolean value を生成するという意味があるのですが、Perl5 ではいわゆる boolean 型というものがそもそも存在していませんので無意味です。