Effektivitaet bei for Schleifen

Status
Nicht offen für weitere Antworten.

Corcovado

Bekanntes Mitglied
Hallo,
gibt es eigentlich Unterschiede in der Effektivitaet von :
Code:
for(iSize = vecLineOrder.size(); iSize > 0; iSize--){
...
und
Code:
for(iSize = 0; iSize < vecLineOrder.size(); iSize++){
...

oder ist das eigentlich dasselbe. Schliesslich findet ja bei der zweiten Zeile fuer jeden Durchgang der for-Schleife ein Funktionsaufruf statt, aber bei der ersten Zeile eben nur ein Funktionsaufruf und dann halt nur noch ein Abpruefen der Werte?
Ist also ein Vergleich zweier Werte schneller als ein Funktionsaufruf (wie eben zB .size(), .length(),...) oder wird der Code generell in der effektiveren der beiden Moeglichkeiten "kompiliert" (weiss nicht ob das hier das richtige Wort dafuer ist) ?
 

meez

Top Contributor
Ich würd mal sagen, dass der ohne mehrmaligen Methodenaufruf effektiver ist, da der kompiler ja nicht weiss, dass die size() Methode immer den selben Wert zurückgibt. Also wird der Class Code so ausfallen, dass die Methode jedesmal aufgerufen wird.

Dies ist nur eine Vermutung...Vielleicht ist der Compiler auch so entwickelt, dass er merkt, wenn in einer Methode "nur" eine Var ohne Logik zurückgegeben wird....
 

Corcovado

Bekanntes Mitglied
Hm, nja war interessant, allerdings weiss ich nicht ob es ausreicht ein paar a's einlesen zu lassen um das zu testen, wie is dass wenn man zB laengere Texte damit irgendwie verarbeiten will, dann sollte man sich wohl an den Artikel des Java Magazins aus dem letzten Thread dazu halten?! Egal, Danke - ich hatte eben dieselbe Vermutung. Ich hab von C++ Compilern gelesen, dass die normalerweise diverse Optimierungen vornehmen, aber ich weiss nicht in wie weit so etwas wirklich in die Realitaet umgesetzt werden kann (Compilertheorie - gepennt...hehehe)...
 
G

Guest

Gast
Die Iterator-Lösung ist schnell genug, wenn es nicht gerade um 10000000 von terationsschritten geht.
Code:
for(Iterator i=vecLineOrder.iterator(); i.hasNext();)
{
  i.next();
}
 

meez

Top Contributor
Iterator ist eine andere Sache, da es da mehr auf die Implementation des Iterator ankommt, und weniger um die Schleife an sich...
 

Illuvatar

Top Contributor
Probiert das mal:
Code:
public class ForPerformanceTest
{
  public final static void main (final String... args)
  {
    System.out.println("Testen Methode 1...:");
    Helper h = new Helper();
    Stopper s1 = new Stopper();
    for (int i = 0; i < h.getMax(); ++i){
      h.doSthWith(i);
    }
    long l1 = s1.getElapsed();
    System.out.println("Testen Methode 2...:");
    Stopper s2 = new Stopper();
    for (int i = 0, j = h.getMax(); i < j; ++i){
      h.doSthWith(i);
    }
    long l2 = s2.getElapsed();
    System.out.println("Methode1: " + l1);
    System.out.println("Methode2: " + l2);
  }
}
class Helper
{
  int getMax()
  {
    sleep(2); //schwierige Berechnung
    return 12000;
  }
  void doSthWith (int num)
  {
    sleep(1); //schwierige Berechnung
    System.out.println(num);
  }
  private void sleep (long l)
  {
    try{
      Thread.sleep(l);
    }catch (InterruptedException e){

    }
  }
}
class Stopper
{
  private long start = System.currentTimeMillis(); //Wird bei Konstruktoraufruf initialisiert
  long getElapsed()
  {
    return System.currentTimeMillis() - start;
  }
}

Ausgabe bei mir:
Methode1: 62922
Methode2: 25719
 

Bleiglanz

Gesperrter Benutzer
wie immer mein hinweis, dass das alles völlig irrelevant ist

dass der Java-Compiler (und anschliessend der JIT) einen list.size() nicht aus der Schleife rausziehen kann ist richtig (könnte sich ja ändern...)

aber in der Praxis ist fast immer der Schleifen-Body wesentlich aufwändiger als das size(); d.h. jede Optimierung in der Hinsicht völlig für die Katz

@Illuvatar: sehr gutes "Beweis"-Beispiel, könntest du das ganze nochmal für mich mit sleep(1) in getMax und sleep(100) in doSthWith durchlaufen lassen (zum Vergleich)? thx
 

Reality

Top Contributor
Bei mir kommt das raus:

Code:
public class PerformanceTest  {
       public  static  void main(String args[]){
               String a = "Das ist ein Test!";
               int b = a.length();
               
               long start = System.currentTimeMillis();
               
               for(int i = 0; i <= 100000000; i++){
                       for(int j = 0; j < a.length(); j++){

                       }
               }
               System.out.println(System.currentTimeMillis() - start);
               
               start = System.currentTimeMillis();
               
               for(int i = 0; i <= 100000000; i++){
                       for(int j = 0; j < b; j++){

                       }
               }
               
               System.out.println(System.currentTimeMillis() - start);
       }

}

Ergebnis:

5107
4867

Liebe Grüße
Reality
 

meez

Top Contributor
Bleiglanz hat gesagt.:
list.size() nicht aus der Schleife rausziehen kann ist richtig (könnte sich ja ändern...)
Nein...Der Kompiler kann ja nicht wissen, dass die Methode jedesmal das gleiche zurückliefert...
 

Bleiglanz

Gesperrter Benutzer
wieso Nein...genau das meinte ich ja mit "nicht rausziehen kann"? Bei list.size() steht weder beim Übersetzen noch zur Runtime fest, dass immer das gleiche rauskommt (Threads...)

@Reality

wenig aussagekräftig, der gcc würde solche Schleifen gleich ganz weglassen :) mach den String a mal final (nur so zum spass)?
 

meez

Top Contributor
Bleiglanz hat gesagt.:
wieso Nein...genau das meinte ich ja mit "nicht rausziehen kann"? Bei list.size() steht weder beim Übersetzen noch zur Runtime fest, dass immer das gleiche rauskommt (Threads...)

Ahhh...falsch verstanden... :oops:
 
G

Guest

Gast
Ändere mal die Reihenfolge der Tests und schau Dir dann das Ergebnis an.
 

Reality

Top Contributor
Umgekehrte Reihenfolge ohne final:
4216
5197

Ein Unterschied ist zwar messbar, aber der ist sogar bei 100000000 Durchläufen marginal.

Liebe Grüße
Reality
 

Illuvatar

Top Contributor
Bleiglanz hat gesagt.:
@Illuvatar: sehr gutes "Beweis"-Beispiel, könntest du das ganze nochmal für mich mit sleep(1) in getMax und sleep(100) in doSthWith durchlaufen lassen (zum Vergleich)? thx

Ich habs nur bis 500 zählen lassen ;)
Ergebnis: 51245 zu 50308.
-> Das kostet mehr als das sleep (1) :!:
 

Bleiglanz

Gesperrter Benutzer
jo, ein wirklich gutes Beispiel!

sleep(1) ist natürlich irgenwie witzlos (weil die JVM für sleep auch Zeit braucht; kann mich erinnern, dass +-5ms oder +-10ms für den Aufruf System.getCurrentTimeMillis()) bei vielen Plattformen normal sind :)

Mikromessungen a la: braucht "a<arrayList.size()" länger als "a<b" scheinen sehr sehr schwierig zu sein (für sowas am besten geeignet ist vermutlich ein uralter 1MHz Rechner...)
 
B

Benutzername

Gast
Ich wäre so froh...

...wenn ich zum Thema Java und Laufzeit in Millisekunden denken müsste :applaus:
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
F KI / Machine Learning Parameter verschachtelte for Schleifen Allgemeine Java-Themen 2
F KI / Machine Learning Parameter verschachtelte for Schleifen Allgemeine Java-Themen 1
A Mehrere for-Schleifen Allgemeine Java-Themen 2
Monokuma Foreach Schleifen in Streams umändern Allgemeine Java-Themen 23
Junger_Basileus Attribute, Arrays, Schleifen Allgemeine Java-Themen 9
E Angabe wie groß Array sein soll und in for-schleifen diesen Array füllen Allgemeine Java-Themen 3
D Integer-Array variabler Größe mit Zahlen befüllen (Schleifen) Allgemeine Java-Themen 0
C Schachbrett mit while-schleifen Allgemeine Java-Themen 7
P Erste Schritte Dynamische Anzahl von verschachtelten Schleifen Allgemeine Java-Themen 5
R kann man irgendwie mit Arrays mit Eingabefenstern und Schleifen Werte abklappern? Allgemeine Java-Themen 2
R n verschachtelte Schleifen? Allgemeine Java-Themen 14
S Welcher Schleifen type für eine Berechnung Allgemeine Java-Themen 7
R Schleifen Allgemeine Java-Themen 11
L for-Schleifen Zählfehler Allgemeine Java-Themen 6
G Code nach Schleifen und Verzweigungen durchsuchen Allgemeine Java-Themen 6
S verzweigungen und schleifen Allgemeine Java-Themen 24
B BigDecimal Schleifen Allgemeine Java-Themen 9
prakdi Zeit zum Durchlauf der Schleifen unverständlich!? Allgemeine Java-Themen 3
B Auslagerung von verschachtelten Schleifen Allgemeine Java-Themen 11
T Verschachtelte Schleifen abbrechen Allgemeine Java-Themen 3
Meldanor For-Schleifen - byte statt int? Allgemeine Java-Themen 11
S Verschachtelte Schleifen Allgemeine Java-Themen 9
Z GC -> Allokation in Schleifen Allgemeine Java-Themen 25
A Fibonacci-Zahlen & kopfgesteuerte Schleifen & Strukt Allgemeine Java-Themen 8
V Vererbung und Schleifen Allgemeine Java-Themen 5
W kompliziertes Konstrukt von Schleifen/If/else. Rekursion? Allgemeine Java-Themen 22
S schleifen Allgemeine Java-Themen 3
A Schleifen in Ant? Allgemeine Java-Themen 5
G Methode mit Schleifen NullPointerException Allgemeine Java-Themen 2
L Schleife über Schleifen Allgemeine Java-Themen 4
M Verschachtelte Schleifen (unbekannte Tiefe) Allgemeine Java-Themen 3
N Code verkürzen(mit schleifen)? Allgemeine Java-Themen 10
C Performance von FOR Schleifen Allgemeine Java-Themen 25
R Lohnt sich byte und short bei Schleifen? Allgemeine Java-Themen 9
P Schleifen liefern Werte nicht wie erwartet Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben