2010-03-16 4 views
6

Verwenden Sie den originalen Sun 1.6-Compiler und JRE/JIT, ist es eine gute Idee, die Art von extensivem Abroll zu verwenden, die von Duffs Device veranschaulicht wird, um eine Schleife aufzurollen? Oder endet es als Codeverschleierung ohne Leistungsvorteil?Macht das Duff-Gerät Java-Code schneller?

Die Java-Profiling-Tools, die ich verwendet habe, sind weniger informativ über zeilenweise CPU-Nutzung als, sagen wir, Valgrind, also wollte ich die Messung mit der Erfahrung anderer Leute erweitern.

Beachten Sie, dass Sie natürlich nicht genau Code Duffs Gerät, aber Sie können die grundlegende Unroll tun, und das ist, was ich mich wundere.

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

durch viele andere Werte.

+3

Ich verstehe Ihre überarbeitete Frage nicht. Duffs Gerät bedeutet nicht nur Durchfall. Die Interlaced-Schleife ist ein Schlüsselelement. –

+5

Warum testest du es nicht? Schreiben Sie wie gewohnt eine Version mit der Schleife. Schreibe eine Version mit der abgerollten Schleife. Schreiben Sie ein Framework, das jeweils millionenfach ausgeführt wird (oder was auch immer). Sehen Sie, ob Leistungssteigerungen durch Optimierungsversuche erzielt werden. –

+0

Keine beste Antwort ??? O.o –

Antwort

22

Es ist nicht viel egal, ob es eine gute Idee ist (ist es nicht), weil es nicht kompilieren wird.

EDIT: Dies ist ausdrücklich in the JLS erwähnt:

Ein Trick als Duff Gerät bekannt ist, kann in C oder C++ verwendet werden, um die Schleife zu entrollen, aber dies ist nicht gültige Code in der Programmiersprache Java:

Oder unverblümte (aus dem gleichen Abschnitt):

Großer C-Hack, Tom, aber es ist hier nicht gültig.

EDIT: Um Ihre mehr (zu) allgemeinen Frage zu beantworten, normalerweise nein. Sie sollten sich generell auf das JIT verlassen.

+0

Entschuldigung, ich habe die Frage nicht ganz unspezifisch gestellt. – bmargulies

8

Sie ignorieren die Tatsache, dass Java zu Bytecodes für eine stapelorientierte virtuelle Maschine kompiliert. Was auch immer Sie als Low-Level-Optimierungstrick auf Java-Ebene versuchen, ist weitgehend ineffektiv. Die eigentliche Optimierung findet statt, wenn der JIT-Compiler die Assembly für die Zielarchitektur erstellt, ein Prozess, den Sie größtenteils weder steuern noch steuern können.

Sie sollten stattdessen bei einem viel größeren Bild optimieren. Lassen Sie den JIT-Compiler die Low-Level-Optimierungen behandeln.

+0

+1 für "Schau dir das größere Bild an" – Thilo

+5

Ich ignoriere es nicht, ich frage dich danach. – bmargulies