Das JIT wird, soweit ich das beurteilen kann, dies nur erkennen, wenn es sich um eine relativ einfache Inline-Methode handelt. Davon abgesehen ist es sehr einfach für einen Programmierer, diese Fälle zu erkennen, und es ist ein schweres Problem für einen JIT-Compiler zu erkennen. Vorzugsweise sollten Sie final int
verwenden, um Ergebnisse von großen Methoden zwischenzuspeichern, da der JIT sehr leicht erkennen kann, dass sich der Wert nicht ändern kann, und sogar Array-Zugriffsprüfungen zur Beschleunigung von Schleifen entfernen kann.
So etwas wie
int[] arr = new int[ 10 ];
for(int i = 0; i < arr.length; i++) {
//...
}
oder
List<String> list = Arrays.asList(new String[] { ... });
for(int i = 0; i < list.size(); i++) {
//...
}
wahrscheinlich sehr leicht durch den JIT optimiert werden kann. Andere Loops, die große oder komplizierte Methoden aufrufen, können nicht ohne weiteres den gleichen Wert zurückgeben, aber Methoden wie size() könnten wahrscheinlich inline oder sogar vollständig entfernt werden.
Schließlich mit for-jeder Schleifen auf Arrays. Sie sind zu der ersten Schleife verfallen, die ich im Fall von Arrays geschrieben habe, und können auch leicht optimiert werden, um die schnellste Schleife zu erzeugen. Obwohl for-each auf Nicht-Arrays schleift, bevorzuge ich es, wenn es um schnelle Schleifen geht, da diese in Iterator-Schleifen zerfallen und nicht die zweite Schleife, die ich gepostet habe. Dies gilt nicht für LinkedList, da ein Iterator schneller ist als get() aufgrund von O (n) traversal.
Dies ist alles Spekulation darüber, was das JIT tun könnte, um eine Schleife zu optimieren. Es ist wichtig zu wissen, dass das JIT nur etwas optimiert, das die resultierenden Effekte nicht verändern kann. Die Dinge einfach zu halten, wird die Arbeit des JITs viel einfacher machen. Wie mit dem endgültigen Keyword. Die Verwendung von finalen Werten oder Methoden ermöglicht es dem JIT, leicht zu beweisen, dass sich nichts ändert und inline wie verrückt werden kann. Das ist die wichtigste Optimierung des JIT, Inlining. Machen Sie diesen Job einfach und das JIT hilft Ihnen im großen Stil.
Hier ist eine link Diskussion Schleife Optimierungen, wo das JIT kann nicht immer eine Schleife optimieren, wenn es nicht beweisen kann, dass die Optimierung nichts ändert.
Warum können Sie nicht tun wie 'int n = someMethod(); ' und dann n später in der Schleife? – Adi
Ich denke, dass http://StackOverflow.com/questions/6093537/for-loop-optimization diese Frage beantwortet. – trooper
Adi, das habe ich in meinem ersten Beispiel gemacht. Meine Frage ist wann ist es notwendig, n zuerst zu berechnen. Ich bin mir sicher, dass es einige Fälle gibt, in denen die zweite Art, wie ich sie geschrieben habe, sowieso wie die erste behandelt wird, aber ich könnte mich damit irren. –