2010-03-16 3 views
6

En utilisant le compilateur Sun 1.6 et JRE/JIT, est-ce une bonne idée d'utiliser le type de déroulement étendu illustré par Duff's Device pour dérouler une boucle? Ou est-ce que ça finit comme une obfuscation de code sans bénéfice de performance? Les outils de profilage Java que j'ai utilisés sont moins informatifs sur l'utilisation du processeur ligne par ligne que, disons, sur valgrind, donc je cherchais à augmenter la mesure avec l'expérience des autres.L'appareil de Duff accélère-t-il le code Java?

Notez que, bien sûr, vous ne pouvez pas exactement code périphérique Duff, mais vous pouvez faire le déroulement de base, et c'est ce que je me demande.

 short stateType = data.getShort(ptr); 
     switch (stateType) { 

     case SEARCH_TYPE_DISPATCH + 16: 
      if (c > data.getChar(ptr + (3 << 16) - 4)) { 
       ptr += 3 << 16; 
      } 
     case SEARCH_TYPE_DISPATCH + 15: 
      if (c > data.getChar(ptr + (3 << 15) - 4)) { 
       ptr += 3 << 15; 
      } 
     ... 

de nombreuses autres valeurs.

+3

Je ne comprends pas votre question révisée. L'appareil de Duff ne veut pas dire juste tomber. La boucle entrelacée est une partie clé. –

+5

Pourquoi ne pas ... le tester? Ecrivez une version avec la boucle comme d'habitude. Ecrire une version avec la boucle déroulée. Ecrire un cadre qui exécute chacun sur un million de fois (ou autre). Voyez ce que, le cas échéant, les gains de performance proviennent de votre tentative d'optimisation. –

+0

Pas de meilleure réponse ??? O.o –

Répondre

22

Peu importe que ce soit une bonne idée (ce n'est pas le cas), car elle ne sera pas compilée.

EDIT: Ceci est mentionné explicitement in the JLS:

Une astuce connue sous le nom de dispositif de Duff peut être utilisé en C ou C++ pour dérouler la boucle, mais ce n'est pas un code valide dans le langage de programmation Java:

Ou, plus crûment (de la même section):

bidouille Grande C, Tom, mais ce n'est pas valable ici.

EDIT: Pour répondre à votre question plus (trop) générale, habituellement non. Vous devriez généralement compter sur le JIT.

+0

Désolé, je n'ai pas fait la question assez peu spécifique. – bmargulies

8

Vous ignorez le fait que Java se compile en bytecodes pour une machine virtuelle orientée pile. Quel que soit le truc d'optimisation de bas niveau que vous essayez au niveau de Java est en grande partie inefficace. L'optimisation réelle se produit lorsque le compilateur JIT produit l'assemblage pour l'architecture cible, un processus que vous ne pouvez ni contrôler ni prendre en compte pour la plupart.

Vous devriez plutôt optimiser à une image beaucoup plus grande. Laissez le compilateur JIT gérer les optimisations de bas niveau.

+0

+1 pour "regardez la photo dans son ensemble" – Thilo

+5

Je ne l'ignore pas, je vous demande à ce sujet. – bmargulies