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% --