Beefy Boxes and Bandwidth Generously Provided by pair Networks
Clear questions and runnable code
get the best and fastest answer

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?

What's my password?
Create A New User
Node Status?
node history
Node Type: snippet [id://388976]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others having an uproarious good time at the Monastery: (9)
As of 2016-12-07 11:46 GMT
Find Nodes?
    Voting Booth?
    On a regular basis, I'm most likely to spy upon:

    Results (125 votes). Check out past polls.