Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl-Sensitive Sunglasses

Re: How to use a variable in tr///

by Anonymous Monk
on Jan 15, 2021 at 17:03 UTC ( #11126966=note: print w/replies, xml ) Need Help??

in reply to How to use a variable in tr///

Regarding performance, s/(.)/$tr{$1}/eg is about 700 times slower than tr/// for long strings. The solution using eval and its precompiled version have only a constant overhead per invocation, which for very short strings is about 30% for the precompiled version, and about 30 times for eval. I was testing translation of all 256 possible byte values.

Replies are listed 'Best First'.
Re^2: How to use a variable in tr///
by Anonymous Monk on Jan 15, 2021 at 23:21 UTC
    show the benchmark code or it didnt happen
      Below is the code. I tried different lengths of strings (upper bound in 1..10000) and number of iterations (first argument to timethese).
      #!/usr/bin/perl use strict; use warnings; use Benchmark qw/cmpthese timethese/; my $y = join "", 1..10000; my %tr; @tr{map chr, 0..255} = map chr, 1..255,0; my $tr = eval 'sub {$_[0] =~ tr/\x00-\xff/\x01-\xff\x00/r}'; my $trans = sub { my $x = $y; $x =~ tr/\x00-\xff/\x01-\xff\x00/r; }; my $subst = sub { my $x = $y; $x =~ s/(.)/$tr{$1}/egr; }; my $eval = sub { my $x = $y; eval '$x =~ tr/\x00-\xff/\x01-\xff\x00/r'; }; my $preceval = sub { my $x = $y; &$tr($x); }; my $z = &$trans; $z eq &$subst or die; $z eq &$eval or die; $z eq &$preceval or die; length($y) == length($z) or die; printf "length: %s\n", length($y); timethese(0, { trans => $trans, subst => $subst, eval => $eval, preceval => $preceval, });

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://11126966]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others taking refuge in the Monastery: (1)
As of 2021-02-27 01:38 GMT
Find Nodes?
    Voting Booth?

    No recent polls found