Beefy Boxes and Bandwidth Generously Provided by pair Networks
There's more than one way to do things
 
PerlMonks  

Duff's Device in Perl

by gaal (Parson)
on Sep 07, 2004 at 10:00 UTC ( #388976=snippet: print w/ replies, xml ) Need Help??
Description: [fall through switch/case in perl brought about mention of Duff's Device. It turns out this construct is portable to Perl from c. Here's an old message to FWP about it.]

Duff's Device 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);
}
Replies are listed 'Best First'.
Re: Duff's Device in Perl
by simonm (Vicar) on Sep 07, 2004 at 17:49 UTC
      For the record, the above snippet is from March 2000.

      Also for the record, it runs under warnings and use strict ;)

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others imbibing at the Monastery: (None)
    As of 2016-07-30 07:26 GMT
    Sections?
    Information?
    Find Nodes?
    Leftovers?
      Voting Booth?
      What is your favorite alternate name for a (specific) keyboard key?


















      Results (265 votes). Check out past polls.