8 votes

Duff's Device fonctionne-t-il dans d'autres langues ?

Il y a de nombreuses années, alors qu'il travaillait sur un problème serré d'E/S graphique, Tom Duff a déroulé une boucle et créé son Dispositif de Duff comme suit :

dsend(to, from, count)
char *to, *from;
int count;
{
    int n = (count + 7) / 8;
    switch (count % 8) {
    case 0: do { *to = *from++;
    case 7:      *to = *from++;
    case 6:      *to = *from++;
    case 5:      *to = *from++;
    case 4:      *to = *from++;
    case 3:      *to = *from++;
    case 2:      *to = *from++;
    case 1:      *to = *from++;
           } while (--n > 0);
    }
}

(Notez que cela utilise les paramètres de fonction de l'ancien style - ce n'est pas une erreur).

Ce codage est directement issu de la réflexion en assembleur et du codage en C, et dépend de l'utilisation de la déclaration de cas du C. Ce type de créativité dans l'entrelacement des structures de contrôle peut-il fonctionner dans d'autres langages ?

6voto

Dave Points 5879

Vous pouvez le faire dans n'importe quel langage qui supporte les instructions GOTO calculées (Fortran, certains BASIC, etc.).

5voto

tpdi Points 18427

Il fonctionne en C++.

Notez que le code généré dépend de votre compilateur. En particulier, lorsque j'ai compilé le dispositif de Duff en utilisant GCC pour cibler les architectures ARM, l'assembleur ARM résultant était sous-optimal (je pense que GCC l'a transformé en une table de saut) à tout niveau d'optimisation.

J'ai fini par coder l'assembleur à la main.

3voto

Michael Burr Points 181287

Le dispositif de Duff est essentiellement un ordinateur goto ce qui peut être fait dans de nombreux autres langages - l'assembleur (bien sûr) et le FORTRAN étant quelques-uns qui les prennent en charge directement.

3voto

Gary Points 967

Je l'ai utilisé avec beaucoup de succès en JavaScript pour accélérer le traitement des grands tableaux. J'aimerais pouvoir l'utiliser en C#.

0voto

Euri Pinhollow Points 242

Même s'il n'est pas possible de l'utiliser de cette façon, vous pouvez toujours avoir deux boucles :

dsend(to, from, count)
char *to, *from;
int count;
{
    int n;
    for(n=0; n!=count/8; n+=8){
        *to = *from++;
        *to = *from++;
        *to = *from++;
        *to = *from++;
        *to = *from++;
        *to = *from++;
        *to = *from++;
        *to = *from++;
    }
    for(; n!=count; n++)
    {
        *to = *from++;
    }
}

Bien sûr, cela sera un peu plus lent avec les petites count mais il est un peu plus lisible, un peu plus portable d'un langage à l'autre et produit un bénéfice très similaire avec de grandes quantités d'eau. count .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X