I'm currently reading the book Higher Order Perl and I'm on the section where it covers memoization. The book says a single multiplication won't be improved on by memoization because of the overhead involved and because multiplication is already fast. I'm surprised that your lookup with ord() and substr() is faster than a single multiplication. The only difference I see is that my function is using a float constant and the ord() and substr() don't need to do float calculations.
#!/usr/bin/env perl
use warnings;
use strict;
use Benchmark 'cmpthese';
my $lookup = join '', map{ chr( $_ / 255 * 100 ) } 0 .. 255;
my $const = 100 / 255;
cmpthese(-2, {
lookup => sub {
my @output = map { ord( substr $lookup, $_, 1 )} 0 .. 255;
},
calc => sub {
my @output = map {$_ / 255 * 100} 0 .. 255;
},
calc2 => sub {
my @output = map {$_ * $const} 0 .. 255;
},
});
my @output1 = map { ord( substr $lookup, $_, 1 )} 0 .. 5;
my @output2 = map {$_ * $const} 0 .. 5;
print "@output1\n";
print "@output2\n";
__END__
# Results on my machine (v5.22.1 built for MSWin32-x64-multi-thread):
Rate calc calc2 lookup
calc 12009/s -- -24% -31%
calc2 15753/s 31% -- -9%
lookup 17376/s 45% 10% --
0 0 0 1 1 1
0 0.392156862745098 0.784313725490196 1.17647058823529 1.5686274509803
+9 1.96078431372549
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.
|