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 ( #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?
[james28909]: what i am trying to accomplish is piping the output of ffmpeg to yet another encryption routine using libsodium. and hopefully once that is done i will be able to forward the packets to discord servers
[RonW]: choroba: Please define "high end" and "low end"
[LanX]: choroba: subversive (as usual ;)
[james28909]: i dunno, if i didnt have so little experience in linux i would swap. but it would be to much of a learning curve for me right now.
[choroba]: Low-end is defined as the Perl that generates millions of income
[choroba]: sorry, that's high-end, of coursse
[choroba]: low end, in my talk, will be code that "we don't touch because it works" and noone knows why
[choroba]: I want to present the most bizzare bugs and misfeatures I met when working for a large financial institution
[choroba]: I already gave a similar talk to my friends in a pub and at an internal conference at work and people liked it, so maybe...
[choroba]: LanX: That's the heritage, I can't do anything else

How do I use this? | Other CB clients
Other Users?
Others making s'mores by the fire in the courtyard of the Monastery: (17)
As of 2017-05-22 21:31 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?