Performante Array iteration

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo

Mich würde interessieren ob das

Code:
for(String name : strArray)
{
			
}

genauso performant ist wie das

Code:
int count = 0;
		
while(true)
{
		    try
		    {
		    	array[count];
		    }
		    catch(ArrayIndexOutOfBoundsException aex)
		    {
		    	
		    }
}

Hat jemand Hintergrundwissen über die Optimierung der verkürzten For-Schleife oder Literatur zu dem Thema?

peace!
 

Wildcard

Top Contributor
Code:
int count = 0;
      
while(true)
{
          try
          {
             array[count];
          }
          catch(ArrayIndexOutOfBoundsException aex)
          {
             
          }
}

Das ist totaler Blödsinn. Wo hast du das her?
 
G

Gast

Gast
Oha wenn ich schon
Code:
while(true)
mit ner Exception als "Abbruchbedingung" sehe bekomme ich schon Kopfschmerzen. Wer kommt denn immer auf solche merkwürdigen Ideen?
 
G

Guest

Gast
geht schneller als

Code:
for(int index = 0; index < array.size(); index++)
{
     array[index];
}

weil da zweimal verglichen wird, einmal durch die For-Schleife und einmal "Array intern", also spart man sich einen Vergleich.

Deshalb die Frage ob bzw. wie die verkürzte For-Schleife optimiert wird.


peace
 
G

Guest

Gast
der count = 0 sollte natürlich incrementiert werden hab ich vergessen
 

foobar

Top Contributor
weil da zweimal verglichen wird, einmal durch die For-Schleife und einmal "Array intern", also spart man sich einen Vergleich.
Deshalb die Frage ob bzw. wie die verkürzte For-Schleife optimiert wird.
Hast du dir das ausgedacht?
Diese "Optimierung" bringt dir bei 10 Million Iterationen vielleicht eine Performancesteiergung von 5 Millis, dafür haste aber nen absolut kruden Code und jeder andere Entwickler wird fragen WTF?
 

tfa

Top Contributor
Ich würde sagen, dass die zweite Lösung sogar langsamer ist als die vernünftige foreach-Schleife. Denn hier könnte der JIT den Array-Bound-Check weg optimieren. Von der Code-Qualität ganz zu schweigen.
 

AlArenal

Top Contributor
If it ain't broke, don't fix it. Hätte man es tatsächlich nötig sich über dererlei Mikrooptimierungen Gedanken zu machen, hätte man besser nicht zu Java gegriffen, sondern gleich in C, Fortran oder Assembler programmiert.
 
G

Guest

Gast
tfa hat gesagt.:
Ich würde sagen, dass die zweite Lösung sogar langsamer ist als die vernünftige foreach-Schleife. Denn hier könnte der JIT den Array-Bound-Check weg optimieren. Von der Code-Qualität ganz zu schweigen.

Achja und wie bitte schaut dann der Maschinencode aus? läuft er einfach durch den Hauptspeicher wie er lustig ist und hört dann per Zufall an einer Stelle auf?
 

tfa

Top Contributor
Anonymous hat gesagt.:
tfa hat gesagt.:
Ich würde sagen, dass die zweite Lösung sogar langsamer ist als die vernünftige foreach-Schleife. Denn hier könnte der JIT den Array-Bound-Check weg optimieren. Von der Code-Qualität ganz zu schweigen.

Achja und wie bitte schaut dann der Maschinencode aus? läuft er einfach durch den Hauptspeicher wie er lustig ist und hört dann per Zufall an einer Stelle auf?

:?:
Nein, die Schleife läuft bis array.length. Was denkst du denn?
 

Wildcard

Top Contributor
Anonymous hat gesagt.:
Achja und wie bitte schaut dann der Maschinencode aus? läuft er einfach durch den Hauptspeicher wie er lustig ist und hört dann per Zufall an einer Stelle auf?
Der JIT kann das Bounds Checking wegoptimieren, nicht das Checking ob noch ein Schleifendurchlauf kommt.
Deine 'Variante' dürfte mit ziemlicher Sicherheit langsamer sein wegen besagtem Boundschecking und auch weil es sehr teuer sein kann ein Exception Objekt zu erzeugen.
Selbst wenn es nicht langsamer wäre, sowas macht man nicht. Niemals.
 

tfa

Top Contributor
Eine Exception zu erzeugen ist auf jeden Fall teuer, da ein Stacktrace generiert werden muss. Keine Ahnung, wie viele 1000 Boundchecks man in der Zeit machen kann.
 
G

Guest

Gast
tfa hat gesagt.:
Anonymous hat gesagt.:
tfa hat gesagt.:
Ich würde sagen, dass die zweite Lösung sogar langsamer ist als die vernünftige foreach-Schleife. Denn hier könnte der JIT den Array-Bound-Check weg optimieren. Von der Code-Qualität ganz zu schweigen.

Achja und wie bitte schaut dann der Maschinencode aus? läuft er einfach durch den Hauptspeicher wie er lustig ist und hört dann per Zufall an einer Stelle auf?

:?:
Nein, die Schleife läuft bis array.length. Was denkst du denn?

Wie meinst du findet er herraus wann er array.length erreicht hat? Vielleicht durch einen Vergleich?
 
G

Guest

Gast
Kann es sein das das Exception-Objekt weg optimiert wird da ich es in dieser Variante garnicht verwende?
 

tfa

Top Contributor
Anonymous hat gesagt.:
Wie meinst du findet er herraus wann er array.length erreicht hat? Vielleicht durch einen Vergleich?
Wie glaubst du, findet er heraus, ob eine ArrayIndexOutOfBoundsException geworfen werden muss?
 
G

Gast

Gast
Oh man nur weil die Schleife so funktioniert ist es noch lange keine gute Schleife. Eine Exception ist nicht dazu gedacht irgendwelche Schleifen abzubrechen wenn man am Ende ist. Eine Exception dient dazu einen Fehler bekannt zu machen (und evtl. zu behandeln).
Beispiel aus dem alltäglichen Leben:

Stell dir vor du fährst mit einem Auto nach hause und willst dann in der Garage parken. Was machst du?

1. Einfach mit Vollgas rein weil das Auto nachdem es die Wand trifft eh stehen bleibt?

oder

2. Schauen wie viel Platz noch ist um dann vor einer Kollision mit der Wand anzuhalten?
 
G

Guest

Gast
tfa hat gesagt.:
Ich würde sagen, dass die zweite Lösung sogar langsamer ist als die vernünftige foreach-Schleife. Denn hier könnte der JIT den Array-Bound-Check weg optimieren. Von der Code-Qualität ganz zu schweigen.

Sorry, jetzt hab ich dich verstanden :shock:
Ich würde mir da aber gerne sicher sein, was beide Beispiele betrifft.
 

Wildcard

Top Contributor
Ich würde mir da aber gerne sicher sein, was beide Beispiele betrifft.
Unnötig. Deine Variante kommt keinesfalls in Frage.
Um 'Optimierungen' sollte man sich sowieso erst dann kümmern, wenn man ein Performanceproblem hat. Wenn man anfängt, dann auch nicht blindlings drauf los, sondern anhand einer Profiler Analyse.
Glaub mir, der Bottleneck ist (sofern du einen hast) nicht die Foreachschleife.
 
G

Guest

Gast
Gast hat gesagt.:
Oh man nur weil die Schleife so funktioniert ist es noch lange keine gute Schleife. Eine Exception ist nicht dazu gedacht irgendwelche Schleifen abzubrechen wenn man am Ende ist. Eine Exception dient dazu einen Fehler bekannt zu machen (und evtl. zu behandeln).
Beispiel aus dem alltäglichen Leben:

Stell dir vor du fährst mit einem Auto nach hause und willst dann in der Garage parken. Was machst du?

1. Einfach mit Vollgas rein weil das Auto nachdem es die Wand trifft eh stehen bleibt?

oder

2. Schauen wie viel Platz noch ist um dann vor einer Kollision mit der Wand anzuhalten?


:D Lustiger Vergleich aber leider falsch

Das Auto bremst in dem Fall von allein und kommt nicht zu schaden, ich laufe ja nicht aus dem Speicherbereich herraus sondern nur bis zu dessen Ende also mache ich auch nichts kaputt

----

Hier hat nicht zufällig jemand lust sich das ganze mal deassimbliert anzuschauen und hier zu posten ? :D
 
G

Gast

Gast
Ne, der try..catch block bleibt erhalten. Ne ArrayIndexOutOfBounds Exception ist eine RuntimeException, diese muss von der methode, die sie wirft nicht explizit angegeben werden. mit anderen worten: soetwas funktioniert:

Code:
public double squareRoot(double value) {
 if(value < 0) 
   throw new IllegalArgumentException("Wurzel kann nur von Positiven zahlen gezogen werden"); 
 return Math.sqrt(value); 

}

Außerdem habe ich an mehreren stellen gelesen, dass try..catch blöcke sehr unperformant sind, da zusätzlich zur normalen abarbeitung des codes auch noch überwacht werden muss, ob eine exception geworfen wird, und wer sie auffängt. Das kostet definitiv mehr zeit, als das iterieren mittels for Schleife.
 
G

Guest

Gast
Anonymous hat gesagt.:
Hier hat nicht zufällig jemand lust sich das ganze mal deassimbliert anzuschauen und hier zu posten ? :D
Nö, aber man kann das ganze ja einfach mal mit einem großen Array (100MB) messen:

Code:
public class Autsch
{
	private static final int[] a = new int[100000000];

	private static void test1()
	{
		Benchmark bm = new Benchmark("klassisch");
		int s = 0;
		bm.start();
		for (int x: a)
		{
			s += x;
		}
		bm.stop();
	}

	private static void test2()
	{
		Benchmark bm = new Benchmark("Exception");
		int s = 0;
		bm.start();
		int i = 0;
		try
		{
			while (true)
			{
				s += a[i++];
			}
		}
		catch (ArrayIndexOutOfBoundsException e)
		{
		}
		bm.stop();
	}

	public static void main(String[] args)
	{
		for (int i = 0; i < 10; ++i)
		{
			test1();
			test2();
		}
	}
}

Bei 10 Messungen bekomme ich folgendes Ergebnis heraus:
Code:
klassisch: 187 ms
Exception: 236 ms
klassisch: 187 ms
Exception: 234 ms
klassisch: 147 ms
Exception: 234 ms
klassisch: 146 ms
Exception: 234 ms
klassisch: 147 ms
Exception: 236 ms
klassisch: 145 ms
Exception: 235 ms
klassisch: 146 ms
Exception: 234 ms
klassisch: 146 ms
Exception: 234 ms
klassisch: 146 ms
Exception: 236 ms
klassisch: 148 ms
Exception: 235 ms

Die Exception-Variante ist also deutlich teurer.

Fred
 

AlArenal

Top Contributor
Liebling, ich habe die Integer geschrumpft!

Fred hat gesagt.:
Nö, aber man kann das ganze ja einfach mal mit einem großen Array (100MB) messen:

Code:
private static final int[] a = new int[100000000];
 
G

Guest

Gast
Ach so... ja, 100 Millionen ints, nicht 100 Millionen Byte :) Also dann 400 MB.
 

Marco13

Top Contributor
Interessanterweise ist der Unterschied zwischen "for" und "exception" ziemlich stark davon abhängig, ob der array final ist oder nicht. Da optimiert der JIT anscheinend noch ein bißchen...

EDIT: Bei mir ist der Unterschied übrigens etwas geringer ... man sollte ggf. noch die JVM-Version angeben. Aber besonders repräsentativ ist der Micro-Benchmark eh nicht.
 

Janus

Bekanntes Mitglied
wie wird der compiler wohl die aufgabe lösen, eine out of bounds exception zu überprüfen? er weiss ganz genau, wie groß das array ist, also wird er exakt so, wie es für die for-schleife nötig ist, bei jedem aufruf des array indices die werte vergleichen. hinzu kommt bei der exception variante aber noch der ganze overhead, der für abfangen von exceptions nötig ist. die variante kann einfach nicht schneller sein.
übrigens kommt diese "exotische" variante in einigen büchern zum thema falsche optimierung vor ;)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Performante Visualisierung groẞer Datenmengen (ohne JFreeChart) Allgemeine Java-Themen 22
P Suche performante PDF Library Allgemeine Java-Themen 20
Fynn29 Liste sortieren ohne Array und ohne vorgegebene Sortierung Allgemeine Java-Themen 24
LucasGlockner Effizienter byte-Zugriff auf ein long[]-Array Allgemeine Java-Themen 8
8u3631984 Frage Performance bei Linked List und Array List Allgemeine Java-Themen 5
M Queue mit einem Array implemetieren Allgemeine Java-Themen 16
M Array Rang eines Elements Allgemeine Java-Themen 4
TheSepp Java bestimmtes Array auf den Wert 0 setzen Allgemeine Java-Themen 32
TheSepp Wie kann man Leerzeichen aus einer Array liste entfernen? Allgemeine Java-Themen 10
B HeapSort für Array of Strings funktioniert nur teilweise Allgemeine Java-Themen 3
noah1407 Array Allgemeine Java-Themen 3
D Methoden Teil-Array mit Maximalwert bestimmen Allgemeine Java-Themen 23
N einem Array Objekte hinzufügen die ihr Array position gespeichert haben Allgemeine Java-Themen 34
N zweidimensionalen Array in dreidimensionalen Array speichern Allgemeine Java-Themen 4
N Schnellste Methode, ein Array durchzugehen? Allgemeine Java-Themen 9
T Objekt Array Aufgabe mit Busdatenbank Allgemeine Java-Themen 2
L Array und Index Allgemeine Java-Themen 26
L die 3 größten Zahlen im Array Allgemeine Java-Themen 1
G jToggleButton in Array/ArrayList Allgemeine Java-Themen 12
S Übergabe eines Sortierkriteriums für ein Artikel Array mittels BiPredicate<Artikel, Artikel> Allgemeine Java-Themen 13
Willi.We Array sortieren Allgemeine Java-Themen 5
gotzi242 Array Summe bestimmen tipps? Allgemeine Java-Themen 14
H Matrix ohne Array erstellen Allgemeine Java-Themen 9
Aboya Char Array rekursiv vergleichen Allgemeine Java-Themen 15
V4ll3.Wff Array in Java Allgemeine Java-Themen 4
Noahscript Aus einem byte Array Steuerungszeichen und Code bekommen und ersetzen Allgemeine Java-Themen 3
H Array Sportschütze Allgemeine Java-Themen 6
Sumo_ow "ArrayIndexOutofBoundsException: 2" Array Problem Allgemeine Java-Themen 6
xGh0st2014 Problem mit Java Array Allgemeine Java-Themen 1
M Array verändern Allgemeine Java-Themen 1
A JavaFX 2 dimensionales array Allgemeine Java-Themen 1
LimDul Direktes return eines Array geht nicht Allgemeine Java-Themen 20
S Array dynamisieren oder ArrayList verwenden? Allgemeine Java-Themen 17
M Java 2D Array für ein Grid erstellen ? Allgemeine Java-Themen 2
H Array mit dem Datentype String[] initializieren Allgemeine Java-Themen 7
L ArrayList mit String Arrays in ein Array umwandeln Allgemeine Java-Themen 1
H Elemente aus ArrayList in Array speichern Allgemeine Java-Themen 8
E Datentypen Wie kann ich die Längen der unterschiedlichen Ebenen aus einem Objekt lesen von dem ich weiß, dass es ein mehrdimensionaler Array ist? Allgemeine Java-Themen 3
N Byte Array in Java "dekomprimieren" Allgemeine Java-Themen 3
parrot Array Aufgabe Allgemeine Java-Themen 3
N String Array Eingabe Allgemeine Java-Themen 6
R Warum wird mir in der Konsole das "Standard Array" ausgegeben? Allgemeine Java-Themen 2
N Variablen Array Länge ändern. Allgemeine Java-Themen 8
D Kgv aller Paare aus einem Array mit n integer berechnen Allgemeine Java-Themen 5
W Enumeration ein Array/List als Eigenschaft mitgeben - warum geht das nicht? Allgemeine Java-Themen 0
kodela Problem mit strukturiertem Array Allgemeine Java-Themen 18
A Array Problem Allgemeine Java-Themen 8
Drachenbauer Wie stelle ich fest, ob ein Objekt in meinem Array vorkommt? Allgemeine Java-Themen 5
F Datei in String-Array einlesen Allgemeine Java-Themen 8
L Objekt aus Objekt-array "löschen" Allgemeine Java-Themen 2
I Array Parameter mit 2 Klassen - NullPointerException Allgemeine Java-Themen 3
X Größten Werte in meinem Array löschen? Allgemeine Java-Themen 16
E Angabe wie groß Array sein soll und in for-schleifen diesen Array füllen Allgemeine Java-Themen 3
F 3 Dimensionales Array mit Allgemeine Java-Themen 9
M Steueralgorithmus verwandelt Array in Anfangszustand Allgemeine Java-Themen 9
W Array vs. ArrayList vs. HashMap Allgemeine Java-Themen 20
D Datentypen 2-3 Baum erstellen mit geordnetem int-array Allgemeine Java-Themen 0
T Objekt in Array packen Allgemeine Java-Themen 6
M Zahlen in Array anordnen Allgemeine Java-Themen 8
M Eclipse Unvollständigen Array ansteuern Allgemeine Java-Themen 2
D Erste Schritte Im Array Werte tauschen Allgemeine Java-Themen 5
Xge For/Array Error: IndexOutOfBounds Allgemeine Java-Themen 4
M Wie kann ich ein int[] Array in einer Methode benutzen? Allgemeine Java-Themen 6
FRI3ND Datentypen Date-Array sortieren - Text mitnehmen? Allgemeine Java-Themen 7
D Integer-Array variabler Größe mit Zahlen befüllen (Schleifen) Allgemeine Java-Themen 0
J Variablen Array ertellen bei model.put Allgemeine Java-Themen 13
S Eindimensionales Array in zweidimensionales Array speichern Allgemeine Java-Themen 5
R convert 2d array list to 2d array Allgemeine Java-Themen 1
J json Array würfel Spalten durcheinander Allgemeine Java-Themen 9
MiMa Array umbau oder Alternative? Allgemeine Java-Themen 5
L Datentypen 3D Array Allgemeine Java-Themen 3
M 2D Array mit unterschiedlichen Längen erstellen und befüllen Allgemeine Java-Themen 11
Mario1409 Methoden JSON Array von URL Allgemeine Java-Themen 8
E Swing Array mit Bildern in GUI darstellen Allgemeine Java-Themen 2
P Array einer abstrakten Klasse Allgemeine Java-Themen 4
H Zweidimensionales Array - Zellen der Tabelle verbinden Allgemeine Java-Themen 2
M Zweidimensionales Array mit Binärzahlen füllen Allgemeine Java-Themen 8
M Array aus Thread Objekten erstellen Allgemeine Java-Themen 2
kodela Dynamisches Array in einer Klasse Allgemeine Java-Themen 5
G Array ohne Aufzählungszeichen ausgeben Allgemeine Java-Themen 6
J Wie kann ich ein Java Array als Säulendiagramm ausgeben? Allgemeine Java-Themen 2
Z 2D Array Pixels reparieren Allgemeine Java-Themen 2
S Algorithmus welcher True-Werte in einem Array findet und auswertet. Allgemeine Java-Themen 5
B Polibios Array erweitern Allgemeine Java-Themen 1
R Index in einem Array löschen Allgemeine Java-Themen 10
R Index in einem Array löschen Allgemeine Java-Themen 2
U Methoden Algorithmus MergeSort String [ ] array sortieren programmieren Allgemeine Java-Themen 17
J Array-List Bubble-Sort Allgemeine Java-Themen 12
4 Variablen Int-Array Int Zuweisen Allgemeine Java-Themen 7
J Array Allgemeine Java-Themen 8
Z Array mit unterschiedlichen Werten Allgemeine Java-Themen 1
L sortiertes Array im main aufrufen klappt nicht. Allgemeine Java-Themen 3
O Mein JButton Array funktioniert nicht Allgemeine Java-Themen 3
A Mit dem letzten bis zum ersten Wert aus Array rechnen Allgemeine Java-Themen 15
A Vector Strings in Array splitten Allgemeine Java-Themen 6
I Muster in Array suchen Allgemeine Java-Themen 10
RalleYTN Datentypen Herausfinden ob Object ein Array ist ohne den Typen des Arrays zu kennen? Allgemeine Java-Themen 12
S Variablen String[] Array per schleife in int[] einlesen Allgemeine Java-Themen 8
B Zahlen manuell eingeben und in Array Speichern Allgemeine Java-Themen 2
R Wärmeleitung, 3d-Array Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben