Gibt es einen Leistungsunterschied zwischen der Verwendung von int a = a + 1 und a ++ in Java? Wenn ja, was ist besser und warum?

7

Könnten Sie mir bitte kurz erklären, dass Sie das verstehen?

    
Surya Chandra 15.02.2012, 11:21
quelle

6 Antworten

3

Blick auf den generierten Bytecode:

%Vor%

generiert (verwende javap -c classname )

%Vor%

Also (jdk1.6.0_18):

%Vor%

erstellt

%Vor%

während

%Vor%

alle ergeben

%Vor%

Allerdings ergab ein grober Leistungstest auf meinem Laptop fast keinen Unterschied in der Laufzeit zwischen den beiden (manchmal war ++ x schneller, manchmal x = x + 1 war schneller), also würde ich mir keine Sorgen machen die Auswirkungen auf die Leistung.

    
beny23 15.02.2012, 11:55
quelle
16

Zunächst sagt die Java Language Specification nichts über das Timing aus. Aber vorausgesetzt, wir verwenden einen typischen Compiler wie Suns javac, sehen wir, dass alle oben genannten Beispiele ( a++ , ++a , a += 1 , a = a + 1 ) entweder in etwas kompiliert werden könnten wie:

  • iinc Anweisung, arbeitet an Variablen:

    %Vor%
  • iadd instuction, mit dem Stack (hier mit der Variable 1 als Speicher):

    %Vor%

Es liegt am Compiler, den bestmöglichen Weg zu finden, sie zu kompilieren. Z.B. da ist kein Unterschied zwischen ihnen. Und es sollte keinen Unterschied zwischen den Aussagen geben - sie alle drücken das Gleiche aus - eins zu einer Zahl hinzufügen.

Das heißt, sowohl die iinc als auch die iadd Version können mit dem JIT zu etwas schnellem und plattformabhängigem kompiliert werden, und am Ende würde ich annehmen, dass eine normale Laufzeit beide Versionen in den gleichen Assemblercode kompiliert .

Mit meinem Compiler, * jdk1.6.0_20 *, verwenden die "increment" -Methoden sogar den gleichen Befehl.

%Vor%

Dies ist die Demontage:

%Vor%     
dacwe 15.02.2012 11:27
quelle
2

Nein, es wird keinen merklichen Unterschied geben. Verwenden Sie das, was Sie am besten finden (normalerweise a++ ).

Erste Regel der Codeoptimierung: nicht.

    
JB Nizet 15.02.2012 11:25
quelle
1

Der Compiler sollte optimieren und es sollte keinen Unterschied geben. Beachten Sie jedoch, dass der Präfix-Inkrementoperator möglicherweise (abhängig vom Compiler) schneller ist als das Postfixäquivalent (auch in C ++ und C #):

++a schneller als a++ , weil der Postfix-Operator eine temporäre Variable erstellen muss. Denken Sie über ihre Implementierung nach:

Präfix:

%Vor%

Postfix:

%Vor%     
vulkanino 15.02.2012 11:27
quelle
0

a ++ ist viel schneller. Es konvertiert in INC-Befehl von Assembler. Aber ich denke, JVM wird a = a + 1 optimieren, so dass Sie sich nicht darum kümmern müssen.

    
shift66 15.02.2012 11:26
quelle
0

Es ist das gleiche, und heutzutage sollte es bei der Compiler-Optimierung nicht so sein. Um die Leistung zu erhöhen, sollten Sie andere größere Probleme wie Allocs überprüfen:)

    
Mario Corchero 15.02.2012 11:27
quelle