Rate Split Molt FAQ Cdarke PrefUN Substr
Split 8.00/s -- -15% -31% -39% -53% -74%
Molt 9.36/s 17% -- -19% -29% -45% -70%
FAQ 11.5/s 44% 23% -- -12% -32% -63%
Cdarke 13.2/s 64% 41% 14% -- -22% -58%
PrefUN 16.9/s 111% 80% 47% 28% -- -46%
Substr 31.3/s 291% 234% 171% 138% 85% --
####
use strict;
use warnings;
use Benchmark qw(cmpthese);
my @numbers;
push @numbers, int rand 1e9 for 1 .. 1000;
my $rcUseCdarke = sub
{
my $res = useCdarke($_) for @numbers;
};
my $rcUseFAQ = sub
{
my $res = useFAQ($_) for @numbers;
};
my $rcUseMolt = sub
{
my $res = useMolt($_) for @numbers;
};
my $rcUsePrefUN = sub
{
my $res = usePrefUN($_) for @numbers;
};
my $rcUseJwkrahn = sub
{
my $res = useJwkrahn($_) for @numbers;
};
my $rcUseSplit = sub
{
my $res = useSplit($_) for @numbers;
};
my $rcUseSubstr = sub
{
my $res = useSubstr($_) for @numbers;
};
cmpthese (50,
{
Cdarke => $rcUseCdarke,
FAQ => $rcUseFAQ,
Jwkrahn => $rcUseJwkrahn,
Molt => $rcUseMolt,
PrefUN => $rcUsePrefUN,
Split => $rcUseSplit,
Substr => $rcUseSubstr
});
sub useCdarke
{
my $number = reverse shift;
$number =~ s/(\d{3})/$1,/g;
$number = reverse $number;
return $number;
}
sub useFAQ
{
my $number = reverse shift;
$number =~
s/(^[-+]?\d+?(?=(?>(?:\d{3})+)(?!\d))|\G\d{3}(?=\d))/$1,/g;
return $number;
}
sub useJwkrahn
{
return scalar reverse join ',', unpack '(a3)*', reverse shift;
}
sub useMolt
{
my $number = shift;
while ($number =~ s/(\d)(\d\d\d)(?!\d)/$1,$2/) {};
return $number;
}
sub usePrefUN
{
my $num = reverse shift;
my @threes = $num =~ /(.{1,3})/g;
return scalar reverse join ',', @threes;
}
sub useSplit
{
my $ct = 0;
my $len = length $_[0];
return join q{},
reverse map
{
++ $ct % 3
? $_
: $ct == $len
? $_
: ($_, q{,})
}
reverse split m{}, $_[0];
}
sub useSubstr
{
my $number = shift;
my $offset = -3;
while (abs $offset < length $number)
{
substr $number, $offset , 0, q{,};
$offset -= 4;
}
return $number;
}
####
Rate Split Molt FAQ Cdarke PrefUN Jwkrahn Substr
Split 7.85/s -- -16% -31% -41% -54% -70% -75%
Molt 9.31/s 19% -- -19% -31% -45% -64% -70%
FAQ 11.4/s 46% 23% -- -15% -32% -56% -63%
Cdarke 13.4/s 71% 44% 17% -- -21% -48% -57%
PrefUN 16.9/s 115% 81% 48% 26% -- -35% -45%
Jwkrahn 25.9/s 230% 178% 126% 93% 53% -- -16%
Substr 30.9/s 293% 231% 170% 130% 83% 19% --