2009-05-03 11 views
6

muchos años mientras trabajaba en un apretado gráficos de E/problema O, Tom Duff desenrollé un bucle y creó su Duff's Device de la siguiente manera: (. Tenga en cuenta este utiliza parámetros de la función viejo estilo - que no es un error)¿Funciona el dispositivo de Duff en otros idiomas? Hace

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); 
    } 
} 

Esta codificación viene directamente del pensamiento en ensamblador y codificación en C y depende de la declaración de caso de C. ¿Puede este tipo de creatividad en las estructuras de control de entrelazado funcionar en otros idiomas?

+0

¿Qué es "antiguos parámetros de función de estilo"? –

Respuesta

4

Puede hacerlo en cualquier lenguaje que soporte GOTO computarizada (Fortran, algunos conceptos básicos, etc.)

+0

pero si no puede calcular dinámicamente la dirección en la que GOTO también debe saltar, se vuelve tan engorroso que ya no lo vale. Así que no creo que sea una buena idea en lenguajes dinámicos como PHP ... –

3

Funciona en C++.

Tenga en cuenta que el código generado depende de su compilador. En particular, cuando compilé el dispositivo de Duff utilizando las arquitecturas ARM de orientación GCC, el ensamblador ARM resultante no era óptimo (creo que GCC lo convirtió en una tabla de saltos) en cualquier nivel de optimización.

Terminé simplemente entregando la codificación del ensamblador.

+3

Sí, fue bueno cuando los compiladores no se optimizaron mucho (que es cuando Duff se le ocurrió). El problema es que en cada paso hay tanto el flujo descendente como la etiqueta 'caso', y se necesita un buen compilador para calcular que no necesita vaciar los registros, etc. Y un compilador así de bueno probablemente será capaz de desenrollar el ciclo de la implementación ingenua de todos modos. Aún así, hace una buena pregunta de entrevista :) –

2

dispositivo de Duff es esencialmente un computarizada goto que se puede hacer de muchas otras lenguas - ensamblaje (por supuesto) y FORTRAN es una pareja que los apoya directamente.

2

Lo usé con mucho éxito en JavaScript para acelerar el procesamiento de gran variedad de matrices. Desearía poder usarlo en C#.

+2

Puedes. No es necesario que el caso de limpieza sea el mismo que el bucle. Haga el ciclo desenrollado n/8 veces, luego 7 pasos condicionales al final. Dado que es para arreglos grandes, cualquier ineficiencia menor en los últimos 7 se pierde en el ruido. –

+3

Paul, si el caso de limpieza no es el mismo que el bucle, entonces no creo que pueda llamarse con razón el dispositivo de Duff. El dispositivo de Duff no se trata solo de desenrollar bucles. Se trata de usar una instrucción 'switch' para saltar al medio de un ciclo desenrollado. –

0

Incluso si no se puede utilizar de esta manera es posible que aún tiene dos bucles:

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++; 
    } 
} 

seguro de que esto será algo más lento con menor count pero es un poco más fácil de leer, un poco más idiomas a través de portátiles y produce muy beneficio similar con gran count.

Cuestiones relacionadas