一般的なインタプリタでは定数の畳み込み最適化が行われるため、プリミティブにたいする演算は最適化されます。
% 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 型というものがそもそも存在していませんので無意味です。