Ok. Hier ist meine Meinung warum?
Wenn Sie beide Skripte Bytecode konvertieren, werden Sie feststellen, dass
- ForInLoop Bereich verwendet. Iterator wird verwendet, um während jeder Schleife voranzukommen. Vergleich (<) direkt auf int (oder Integer), um zu bestimmen, ob die Abbruchbedingung erfüllt ist oder nicht
- ForLoop verwendet traditionellen Schritt, überprüft Bedingung und Aktion ausführen. Für Zustand Überprüfung i < 10000000 nutzt ScriptBytecodeAdapter .compareLessThan abgefahrene. Wenn Sie tief den Code in das Verfahren graben, werden Sie beide Seiten des Vergleichs finden sich genommen in als Objekt und es gibt so viele Dinge, die sich, Gießen, sie als Objekt zu vergleichen usw.
ScriptBytecodeAdapter .compareLessThan - >ScriptBytecodeAdapter .compareTo ->DefaultTypeTransformation .compareTo
Es gibt andere Klassen in typehandling Paket, das speziell für die mathematischen Datentypen compareTo-Methode implementiert, nicht sicher, warum sie nicht verwendet werden, (wenn sie nicht verwendet wird)
ich, dass ich zu ahnen, ist der Grund, zweite Schleife länger nimmt. Bitte korrigieren Sie mich, wenn ich falsch liege oder etwas vermisse ...
Das erklärt es fast sicher. Ich weiß, dass die for-Schleife im Java-Stil mehr Flexibilität bietet, was Sie tun können, aber sicherlich hätten sie eine Optimierung auf ihre grundlegendste (und am häufigsten verwendete) Form anwenden können, so dass sie genauso gut funktioniert wie die for..in-Schleife? Das ist eine kleine Performance-Falle für Leute, die aus Java oder C# kommen ... – Xiaofu
Niemand erwartet jemals so viel Unterschied in diesen beiden Operationen. Bereiche, in denen sich Groovy verbessern könnte, zumal ähnlicher Code in Java in 300 mS ausgeführt wird. –
+1 für den Bytecode suchen. – Leonel