[Date Prev][Date Next][Thread Prev][Thread Next] [Search] [Date Index] [Thread Index]

[FWP] Duff's Device in Perl



Duff's Device (http://www.lysator.liu.se/c/duffs-device.html) is
an insane optimization originally invented to speed up writes
to a serial device. The original is in c, but I wanted to see if
I can code it in Perl.

It actually works, with a little kneading and much less of the
original 50% performance gain. This is to be expected, because
we're emulating pointer arithmetic for (not very) random string
access. Another slowdown is the inavailibility of number-only
labels. Anyone care to improve on Gaal's Gobbeldygook? <g>


[the assignment to $to in Perl is spurious, of course. Replace it
with your particular write_one_char_to_device() function]


use integer;
[...]
sub trivial_loop {
    my $from = shift;
    my $to;
    my $i;
    my $count = length $from;

    for ($i = 0; $i < $count; $i++) { $to = substr $from, $i, 1 }
}

sub duff {
    my $from = shift;  # real life would use reference here, this is a demo
    my $to;            # dummy: simulate write to serial i/o port
    my $i = 0;

    my ($n, $count);
    $count = length $from;

    $n = ($count + 7) / 8; # use integer in effect

    goto l. ($count % 8);           # number-only labels don't work :-(
    l0: do {    $to = (substr $from, $i++, 1);
    l7:         $to = (substr $from, $i++, 1);
    l6:         $to = (substr $from, $i++, 1);
    l5:         $to = (substr $from, $i++, 1);
    l4:         $to = (substr $from, $i++, 1);
    l3:         $to = (substr $from, $i++, 1);
    l2:         $to = (substr $from, $i++, 1);
    l1:         $to = (substr $from, $i++, 1);
        } while (--$n>0);
}

-- 
believing is seeing
gaal@forum2.org
http://www.forum2.org/gaal/

==== Want to unsubscribe from Fun With Perl?  Well, if you insist...
==== Send email to <fwp-request@technofile.org> with message _body_
====   unsubscribe