Beefy Boxes and Bandwidth Generously Provided by pair Networks
Problems? Is your data what you think it is?
 
PerlMonks  

Duff's Device in Perl

by gaal (Parson)
on Sep 07, 2004 at 10:00 UTC ( [id://388976]=CUFP: print w/replies, xml ) Need Help??

[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
Domain Nodelet?
Node Status?
node history
Node Type: CUFP [id://388976]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others meditating upon the Monastery: (3)
As of 2024-04-25 22:14 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found