tokuhirom's Blog

How to optimize smart match operator in perl5 interpreter.

This entry is just thinking note for me.

% perl -MO=Terse -e '1 ~~ 2'
LISTOP (0x11ba080) leave [1] 
    OP (0x11ab4f0) enter 
    COP (0x11b9c30) nextstate 
    BINOP (0x11ba150) smartmatch 
        SVOP (0x11ba3e0) const  IV (0x1195328) 1 
        SVOP (0x11ba290) const  IV (0x11b0890) 2 
% perl -MO=Terse -E 'given(1) { when (2) { } }'
LISTOP (0x1171d30) leave [1] 
    OP (0x105e0e0) enter 
    COP (0x11a2970) nextstate 
    UNOP (0x1171db0) leavegiven 
        LOGOP (0x1171d70) entergiven [1] 
            SVOP (0x105df70) const  IV (0x11a3c28) 1 
            LISTOP (0x1171df0) scope 
                OP (0x10ff2e0) null [177] 
                UNOP (0x1171e30) leavewhen 
                    LOGOP (0x1171ea0) enterwhen 
                        BINOP (0x1172010) smartmatch 
                            OP (0x11a1880) padsv [1] 
                            SVOP (0x11a28f0) const  IV (0x117c750) 2 
                        LISTOP (0x11a28b0) scope 
                            OP (0x11a1940) stub 
                            OP (0x1065770) break 

I think following heuristic knowledge.

If perl5 adds optimized pp_* such as pp_smartmatch_right_operand_is_array, given-when will even fast.

And, I think following four op codes might be useful.


「smart match operator の右辺値はほとんどの場合で定数値」だとおもう。
よって、その知識をいかして最適化したらどうかなーとおもったという話。

いろいろな種類の型にあわせて処理しなきゃいけないのが遅いという面があるけど、右辺値が定数であるというアノテーションがあれば、もろもろの処理をとばせるので速いとおもう。

でもいろいろめんどくさいので、実装するのはやめた。けどせっかく思いついたのでメモしといたという具合。