Я предполагаю, что модули ядра Perl в порядке?
Как насчет использования собственной (двоичной) целочисленной математики и преобразования из результата base 36 с использованием POSIX :: strtol ()
Существует ОГРОМНАЯ изменчивость скорости в различных методах преобразования в / из базы 36. Strtol в 80 раз быстрее, чем, например, Math :: Base36: decode_base36 и сабвуферы преобразования, которые есть в список в 2-4 раза быстрее, чем Math :: Base36. Они также поддерживают любое целое число до 62. (легко расширяется добавлением символов в массив nums.)
Вот быстрый тест:
#!/usr/bin/perl
use POSIX;
use Math::BaseCnv;
use Math::Base36 ':all';
use Benchmark;
{
my @nums = (0..9,'a'..'z','A'..'Z');
$chr=join('',@nums);
my %nums = map { $nums[$_] => $_ } 0..$#nums;
sub to_base
{
my ($base, $n) = @_;
return $nums[0] if $n == 0;
return $nums[0] if $base > $#nums;
my $str = '';
while( $n > 0 )
{
$str = $nums[$n % $base] . $str;
$n = int( $n / $base );
}
return $str;
}
sub fr_base
{
my ($base,$str) = @_;
my $n = 0;
return 0 if $str=~/[^$chr]/;
foreach ($str =~ /[$chr]/g)
{
$n *= $base;
$n += $nums{$_};
}
return $n;
}
}
$base=36;
$term=fr_base($base,"zzz");
for(0..$term) { push @numlist, to_base($base,$_); }
timethese(-10, {
'to_base' => sub { for(0..$#numlist){ to_base($base,$_); } },
'encode_base36' => sub { for(0..$#numlist){ encode_base36($_); } },
'cnv->to 36' => sub { for(0..$#numlist){ cnv($_); } },
'decode_base36' => sub { foreach(@numlist){ decode_base36($_); } },
'fr_base' => sub { foreach(@numlist){ fr_base($base,$_); } },
'cnv->to decimal' => sub { foreach(@numlist){ cnv($_,$base,10); } },
'POSIX' => sub { foreach(@numlist){ POSIX::strtol($_,$base);}},
} );