Readonly my $n_true => 1; #### Readonly::Scalar my $r_true => 1; #### #! /run/bin/perl #~ use strict; use warnings; use Benchmark qw[ cmpthese ]; use constant { C_TRUE => 1, C_FALSE => 0, C_VALUE => 12345, }; use Readonly; # Correct... Readonly::Scalar my $r_true => 1; Readonly::Scalar my $r_false => 0; Readonly::Scalar my $r_value => 12345; # Much slower... Readonly my $n_true => 1; Readonly my $n_false => 0; Readonly my $n_value => 12345; # My... my $m_true = 1; my $m_false = 0; my $m_value = 12345; # Package variables... $p_true = 1; $p_false = 0; $p_value = 12345; sub usingConstant { for( 1 .. 1e6 ) { if( C_TRUE ) { my $sum = C_VALUE * C_VALUE; } elsif( C_FALSE ) { ;## Never called } } } sub usingReadonly { for( 1 .. 1e6 ) { if( $r_true ) { my $sum = $r_value * $r_value; } elsif( $r_false ) { ;## Never called } } } sub usingNo_XS { for( 1 .. 1e6 ) { if( $n_true ) { my $sum = $n_value * $n_value; } elsif( $n_false ) { ;## Never called } } } sub usingPackage { for( 1 .. 1e6 ) { if( $p_true ) { my $sum = $p_value * $p_value; } elsif( $p_false ) { ;## Never called } } } sub usingMy { for( 1 .. 1e6 ) { if( $m_true ) { my $sum = $m_value * $m_value; } elsif( $m_false ) { ;## Never called } } } sub usingLiterals { for( 1 .. 1e6 ) { if( 1 ) { my $sum = 12345 * 12345; } if( 0 ) { ;## Never called } } } cmpthese -20, { const => sub{ usingConstant() }, Readonly => sub{ usingReadonly() }, My => sub{ usingMy() }, literals => sub{ usingLiterals() }, package => sub{ usingPackage() }, No_XS => sub{ usingNo_XS() }, }; __END__ c:\test>ROvCONST.pl s/iter Readonly const Readonly 5.66 -- -98% const 0.141 3931% -- (including No_XS; 1.60 GHz fixed) No_XS 0.159/s -- -94% -94% -94% -96% -97% My 2.76/s 1638% -- -1% -3% -36% -40% Readonly 2.79/s 1661% 1% -- -2% -35% -39% package 2.86/s 1700% 4% 2% -- -34% -38% literals 4.33/s 2630% 57% 55% 52% -- -6% const 4.60/s 2796% 67% 64% 61% 6% -- Rate No_XS Readonly My package literals const No_XS 0.161/s -- -94% -94% -95% -96% -97% Readonly 2.76/s 1619% -- -2% -8% -37% -42% My 2.82/s 1659% 2% -- -6% -35% -40% package 2.99/s 1764% 8% 6% -- -31% -37% literals 4.36/s 2618% 58% 55% 46% -- -8% const 4.73/s 2847% 71% 68% 58% 8% -- Rate No_XS Readonly My package literals const No_XS 0.158/s -- -94% -94% -95% -96% -97% Readonly 2.80/s 1666% -- -2% -6% -37% -41% My 2.85/s 1697% 2% -- -5% -36% -40% package 2.99/s 1785% 7% 5% -- -33% -37% literals 4.47/s 2723% 60% 57% 50% -- -5% const 4.73/s 2885% 69% 66% 58% 6% --