2 Stimmen

Effizienz von Java-Code mit primitiven Typen

Ich möchte fragen, welcher Teil des Codes in Java effizienter ist? Code 1:

void f()
{
 for(int i = 0 ; i < 99999;i++)
 {
  for(int j = 0 ; j < 99999;j++)
  {
   //Some operations
  }
 }

}

Code 2:

void f()
{
 int i,j;
 for(i = 0 ; i < 99999;i++)
 {
  for(j = 0 ; j < 99999;j++)
  {
   //Some operations
  }
 }

}

Mein Lehrer sagte, dass die zweite besser ist, aber ich kann dieser Meinung nicht zustimmen.

2voto

H-H Punkte 4161

Nein, es macht überhaupt keinen Unterschied (in Bezug auf die Geschwindigkeit). Sie werden beide in denselben Code kompiliert. Und es gibt keine Zuweisung und Freigabe gehen auf wie MasterGaurav sagte.

Wenn die Methode beginnt, weist die JVM genügend Speicherplätze für alle lokalen Variablen zu, und bis zum Ende der Methode werden keine weiteren Zuweisungen vorgenommen.

Der einzige winzige, unbedeutende Unterschied (abgesehen vom Anwendungsbereich) besteht darin, dass im ersten Beispiel der für i und j zugewiesene Speicher für andere Variablen wiederverwendet werden kann. Daher wird die JVM weniger Speicherplätze für diese Methode zuweisen (und einige Bits einsparen)

0voto

ablaeul Punkte 2700

Erstens: Ja, dein Lehrer hat Unrecht, der zweite Code ist nicht besser. Was bedeutet überhaupt besser? Das liegt daran, dass in jeder normalen Schleife die Operationen innerhalb des Schleifenkörpers der Teil sind, der zeitaufwendig ist. Code 2 ist also nur eine Mikrooptimierung, die nicht genug Geschwindigkeit bringt (wenn überhaupt), um die schlechte Lesbarkeit des Codes zu rechtfertigen.

-4voto

gvaish Punkte 9254

Die zweite ist besser für die Geschwindigkeit.

Der Grund dafür ist, dass im ersten Fall der Umfang der j ist auf den inneren Bereich beschränkt for Schleife.

In dem Moment, in dem die innere Schleife beendet ist, wird der Speicher für j wird freigegeben und für die nächste Iteration der äußeren Schleife erneut zugewiesen.

Da die Speicherzuweisung und -freigabe einige Zeit in Anspruch nimmt, auch wenn sie auf dem Stack erfolgt, ist die Leistung der ersten Variante langsamer.

-4voto

Georg Edelmann Punkte 3

Es gibt noch einen weiteren Aspekt, der bei den beiden unterschiedlichen Versionen sehr wichtig ist:

Während in Variante 2 nur zwei temporäre Objekte erstellt werden (i und j), werden in Variante 1 100000 Objekte erstellt (1 x i und 999999 x j). Wahrscheinlich wird Ihr Compiler dies optimieren, aber das ist etwas, bei dem Sie nicht sicher sein können. Wenn er es nicht optimiert, wird sich die Garbage Collection deutlich schlechter verhalten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X