Nutzen, erst deklarieren, oder neu erstellen?

DenialOfFavor

Neues Mitglied
Hallo,

ich habe eine Frage, die ich mir momentan nicht selbst beantworten kann, beziehungsweise wo ich mir nicht hunderprozentig sicher bin.

Java:
Object object;
        
        for (Object[] obj : objects) {
            
            object = obj;
            
            object...
        }
        
        /* Oder: */
        
        for (Object[] obj : objects) {
            
            Object object = obj;
            
            object...
        }

Also, mich interessiert jetzt, ob es einen Unterschied gibt. Verbraucht es mehr Ressourcen ein Objekt in einer for-Schleife immer neu zu erstellen und zu beschreiben, oder ist es sinnvoller, beziehungsweise spart es Ressourcen ein Object erst zu deklarieren und dann in einer for-Schleife immer zu beschreiben.

Ich denke Methode 2) ist deutlich effizienter, würde nur gerne Bestätigung bekommen.


EDIT:

Mein Beispiel ist jetzt schon ziemlich blöd. Stell Euch vor, dass das Objekt in dem Objekt-Array zum Erstellen eines neuen Objektes benötig wird. (new Objekt(obj.getX(), obj.getY(), obj.getHeight()), z.B..)
 
Zuletzt bearbeitet:

xehpuk

Top Contributor
Da wird ja kein Objekt neu erstellt. Es wird lediglich eine zweite Referenz auf ein bestehendes Objekt erstellt.

Die zweite Version erzeugt einen kleineren Bytecode. Sie läuft vielleicht eine Nanosekunde schneller. ;)

Im Grunde genommen geht es hier eher weniger um Performance, sondern mehr um Paradigmen. Und dort ist ganz klar die zweite Version vorzuziehen, da die Variable den kleinsten Scope erhält.

Ich frage mich allerdings, wieso du es nicht gleich so machst:
Java:
        for (Object[] obj : objects) {
            obj...
        }
 
M

Marcinek

Gast
Eine typische dennisXX frage.

Der Code ist so nicht mal kompilierbar, da du versuchst ein Array einem object zuzuordnen, das kein Array ist.
 

faetzminator

Gesperrter Benutzer
Marcinek, wie kommst du zu der Annahme, dass... *oh nein bitte nicht* ;) ?
Abgesehen davon, dass das Beispiel des TO keinen grossen Sinn macht, weil man genau dafür die for-each Loop hat, man wählt Variante 2 wegen des Scopes der Variable. Mit einer "normalen" for-Schleife würde das Sinn machen:
Java:
Object obj;
for (int i = 0; i < list.size(); i++) {
    obj = list.get(i);
    // ...
}
// vs
for (int i = 0; i < list.size(); i++) {
    Object obj = list.get(i);
    // ...
}
Aber eben, Variante 1 ist IMHO strikte zu vermeiden.
 

FArt

Top Contributor
Die VM optimiert am besten, wenn man nicht selber versucht es besser zu machen als der Optimizer.

Schreibt Standardcode. Haltet Scopes so klein wie möglich. Das ist logisch, besser zu lesen und wird (wenn möglich) von der VM sinnvoll optimiert.

Beispiel:
Code:
for (int i = 0; i < 10000000; i++) {
  MyObject o = new MyObject();
  ... // mache etwas mit o
}

Wenn die Instzen von o außerhalb des Scopes der for-Schleife nicht sichtbar sind (also auch nicht anderweitig gespeichert werden) werden hier nicht tausende Objekte angelegt und hinterher wieder vom GC verworfen. Die VM macht das besser.
Optimierungen dieser Art werden dadurch ausgehebelt, dass der Sichtbarkeitsscope künstlich vergrößert wird.

Noch mal: Standardcode ist besser als vermeintlich "optimierter" Code. Wir schreiben hier kein C.
 
N

nillehammer

Gast
FArt hat gesagt.:
...Noch mal: Standardcode ist besser als vermeintlich "optimierter" Code. Wir schreiben hier kein C.
War für mich jetzt zwar nicht wirklich neu. Aber man kann es nicht oft genug so deutlich wiederholen. Deswegen gab's auch ein "Danke".
 

DenialOfFavor

Neues Mitglied
Hallo,

danke an alle. Danke an FArt. Das kann ich mir gut einprägen. (Scopes so klein wie möglich halten = besser für den Optimizer, beziehungsweise, erzielt besseres Ergebnis)
 

Marco13

Top Contributor
WIE "intelligent" die tatsächlich im JDK umgesetzten Strategien diesbezüglich sind, weiß ich nicht, aber es KÖNNTE sein, dass der möglichst kleine Scope (neben der höheren Lesbarkeit) auch leichtere oder mehr Optimierungen bzgl. Escape Analysis erlaubt - im Prinzip das, was FUrz... äh FArt ( :bae: ) angedeutet hat....
 

FArt

Top Contributor
WIE "intelligent" die tatsächlich im JDK umgesetzten Strategien diesbezüglich sind, weiß ich nicht, aber es KÖNNTE sein, dass der möglichst kleine Scope (neben der höheren Lesbarkeit) auch leichtere oder mehr Optimierungen bzgl. Escape Analysis erlaubt - im Prinzip das, was FUrz... äh FArt ( :bae: ) angedeutet hat....

Ich wollte keine warme Luft (hi hi) mit Fachbegriffen wie "Escape Analysis" erzeugen... vermutlich weil es mir nicht eingefallen ist, wie das Zeug jetzt genau heißt... ;-)
 
S

Spacerat

Gast
WIE "intelligent" die tatsächlich im JDK umgesetzten Strategien diesbezüglich sind, weiß ich nicht, aber es KÖNNTE sein, dass der möglichst kleine Scope (neben der höheren Lesbarkeit) auch leichtere oder mehr Optimierungen bzgl. Escape Analysis erlaubt...
Da es sich beim Bytecode um Assembler ähnliche Opcodes handelt, sollte man fast annehmen, dass die JVM auch Assembler ähnlich ihre Scopes anlegt (das wäre nebenbei auch 'ne Erklärung dafür, warum es in Java kein Call-By-Value gibt). Im simpelsten Fall also einfach das Verbiegen eines Stapelzeigers (Userstack) um für die im Scope verwendeten Variablen und Parameter notwendige Anzahl an Bytes. Eine Escapeanalyse reduziert sich dann entsprechend auf das Zurücksetzen dieses Zeigers beim Scope-Exit. (Vgl. CDECL)
 
S

Spacerat

Gast
Wow... jetzt hab' ich auch verstanden, wobei es um Escapeanalyse geht...
Wie es aussieht, legt der JIT die Scopes genau so an, wie ich es oben beschrieben habe. Die EA wird nur beim kompilieren eines Scopes (Klasse, Methode, Schleife) in nativen Code durchgeführt und betrifft ausschlieslich Instanzen, die innerhalb eines solchen Scopes angelegt werden (z.B. new-Operator). Das bedeutet, dass Objekte nicht mehr zwangsläufig im Heap angelegt werden, sondern das evtl. der Userstack damit belastet wird. Der Vorteil ist klar. der GC muss um auf dem Stack angelegte Objekte beim verlassen eines Scopes nicht mehr kümmern, diese sind bereits dann Geschichte, wenn der Pointer zurückgesetzt wurde. Hab' zwar noch nicht rausgefunden, wann der JIT ein Objekt auf dem Stack alloziieren lässt, aber ich bin ja auch noch am Anfang der PDFs.
Für den TO ist das aber wahrscheinlich relativ unwichtig. Er will ja nur wissen, wo man seine Objekte am sinnvollsten deklariert.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Zrebna Wieso sollte man Null-Prüfungen nicht mit Optional-Objekten nutzen? Allgemeine Java-Themen 13
berserkerdq2 Shapes als Buttons nutzen, schlechter Programmierstyle? Allgemeine Java-Themen 1
B HTTP Allgemeine Fragen über Suchmaschine nutzen mit Java Allgemeine Java-Themen 20
M pfx-Zertifikat in Tomcat für SSL-Verschlüsselung nutzen Allgemeine Java-Themen 14
berserkerdq2 Threads, wie genau läuft das in Java ab? (Ich kann Threads erstellen und nutzen, nur das Verständnis) Allgemeine Java-Themen 6
X Java gewerblich nutzen mit externe Bibliothek. Was zu beachten? Allgemeine Java-Themen 18
F Junit Test + Cucumber - JSON auslesen und in einem weiteren Schritt nutzen Allgemeine Java-Themen 0
xYurisha Nutzen von Importmethoden bei Klasseninstanzen Allgemeine Java-Themen 12
Neumi5694 Best Practice Vorhandene Programminstanz nutzen Allgemeine Java-Themen 3
S Eclipse Github Projekt in eigenes Projekt einbinden und nutzen Allgemeine Java-Themen 13
R Variable durch mehrere Methoden ändern und nutzen Allgemeine Java-Themen 17
I Programm im Hintergrund bei Windows zur Steuerung der Tastatur nutzen Allgemeine Java-Themen 2
Neumi5694 Offenes Programm nutzen Allgemeine Java-Themen 4
T javax.script (JavaScript): Nicht-JRE-Packages importieren/nutzen Allgemeine Java-Themen 4
S Welche Nutzen bringen Lamda Expressions? Allgemeine Java-Themen 1
B Lua als Konfigurationsdatei nutzen - ein Krampf Allgemeine Java-Themen 4
F Über Java Google Suche nutzen Allgemeine Java-Themen 11
A COM und JAVA nutzen Allgemeine Java-Themen 1
J C++ Projekt (QT) in Java mit Klassen (nicht imperativ) nutzen (BridJ? JavaCPP? SWIG? JNA? JNI?) Allgemeine Java-Themen 2
S lp_solve mit Java nutzen - Can't find dependent libraries Allgemeine Java-Themen 8
T HTTP HttpWebRequest in Swing-Projekt nutzen Allgemeine Java-Themen 4
M DLL aus jar extrahieren und als lib nutzen Allgemeine Java-Themen 24
G RXTX in proprietärer Software nutzen?! Allgemeine Java-Themen 10
C Variablen Variable einer Klasse in einer anderen Klasse Nutzen Allgemeine Java-Themen 8
thetagman Programmidee: VirtualCorkboard - Evaluation, Nutzen & Meinung Allgemeine Java-Themen 12
D Darf ich jakarta bibliotheken ohne weiteres nutzen? Allgemeine Java-Themen 10
S Profiler-Funktionen in eigener Applikation nutzen..? Allgemeine Java-Themen 5
C Kann Methode nicht aus Klassenname implements Runnable nutzen Allgemeine Java-Themen 7
G C# DLL in Java nutzen Allgemeine Java-Themen 4
T cpp Programm via jna in java nutzen Allgemeine Java-Themen 3
Meldanor Datei aus jar nutzen Allgemeine Java-Themen 4
J Alte version nutzen Allgemeine Java-Themen 4
M Rechenweg in Datenbank speichern und nutzen Allgemeine Java-Themen 6
G konstanter String[] laesst sich nicht in Annotation nutzen Allgemeine Java-Themen 2
G Variable global nutzen Allgemeine Java-Themen 4
D Welches Pattern kann ich nutzen? Allgemeine Java-Themen 9
H StartupFolder nutzen! Aber wie? Allgemeine Java-Themen 4
D Einfaches Nutzen von Plugins mittels generischer Methode Allgemeine Java-Themen 3
V Setter zum Berechnen nutzen? Allgemeine Java-Themen 5
G Was nutzen statt Mehrfachvererbung? Allgemeine Java-Themen 7
R Wie Google & Co mit Java nutzen? Allgemeine Java-Themen 16
W InputStream öfters nutzen Allgemeine Java-Themen 9
H einzelner Thread --> Nutzen?! Allgemeine Java-Themen 3
L Wie Pattern anwenden um Cipher zu nutzen Allgemeine Java-Themen 2
G DB connection in anderen Klassen nutzen! Allgemeine Java-Themen 7
K Warum static-Methoden nutzen Allgemeine Java-Themen 26
E NT-Anmeldung in Java Client-Applikation nutzen. JAAS ? Allgemeine Java-Themen 5
M java api offline nutzen? Allgemeine Java-Themen 4
J COM-Port unter Windows nutzen Allgemeine Java-Themen 2
B Programm unter GPL nutzen Allgemeine Java-Themen 6
K Problem mit Vererbung - Kein wirklicher Nutzen. Allgemeine Java-Themen 10
T GPL Code inkommerzieller Software nutzen? Allgemeine Java-Themen 26
G Funktionstasten nutzen Allgemeine Java-Themen 3
S Klassen aus JDK 1.5. außerhalb von 1.5. nutzen Allgemeine Java-Themen 6
S MediaTracker nutzen um festzustellen ob schreibvorgang ende. Allgemeine Java-Themen 5
M Webstart nutzen? Allgemeine Java-Themen 9
thE_29 Externe (unbekannte) Klasse nutzen Allgemeine Java-Themen 11
P DLLs nutzen Allgemeine Java-Themen 3
M Input/Output FileChannel writes / werden diese gecached vom OS und dann erst geschrieben? Allgemeine Java-Themen 6
S Fehlermeldungen erscheinen erst in der Ausführung des Programms Allgemeine Java-Themen 11
H Runtime reagiert erst wenn Programm abbricht Allgemeine Java-Themen 1
D mouseWheelMoved => erst reagieren, wenn für 1s das Mausrad nicht mehr benutzt wurde Allgemeine Java-Themen 4
S Start des zweiten Threads erst nach Beenden des ersten Threads Allgemeine Java-Themen 13
T MEthodenauruf testen, wenn instanz erst erzeugt wird Allgemeine Java-Themen 0
G Button-Registrierung beim ActionListener erst NACH Tastendruck Allgemeine Java-Themen 2
H Scanner: Ausgabe erst nach Abbruch Allgemeine Java-Themen 8
H StackOverflowError erst ab 87 Array Elementen Allgemeine Java-Themen 4
F externes Programm beginnt erst nach dem ende des mainprogrammes Allgemeine Java-Themen 3
-MacNuke- Calendar erst nach getTime() gesetzt? Allgemeine Java-Themen 4
T Threadsicheres wait() [lock erst mit wait() abgeben] Allgemeine Java-Themen 31
S Zweiten Thread erst starten wenn erster Thread beendet ist ? Allgemeine Java-Themen 6
B Datei erst öffnen, wenn EOF gesetzt ? Allgemeine Java-Themen 4
M Programmablauf nach letzter eingabe erst fortsetzten Allgemeine Java-Themen 2
G Aktualisierung erst nach minimiertem Browser Allgemeine Java-Themen 6
F Werte von Member-Variablen erst im Konstruktor setzen? Allgemeine Java-Themen 7
C externes Programm läuft erst nach schließen des mainprogramm Allgemeine Java-Themen 7
S [1/2done] Woher bekommt man libarys die es erst ab 1.6 gibt. Allgemeine Java-Themen 10
J Bibliotheken erst zur Laufzeit laden Allgemeine Java-Themen 5
N InputStream erst ab gegebener Position Allgemeine Java-Themen 4
S erst containsKey oder gleich get Allgemeine Java-Themen 9
bernd java.util.Scanner erst ab Java 1.5? Allgemeine Java-Themen 4
A Variable, welche Exeption wirft als "Global" deklarieren Allgemeine Java-Themen 13
A Scanner Variable Klassenimtern deklarieren Allgemeine Java-Themen 12
Javafan01 Deklarieren einer Math.random() Zufallszahl Allgemeine Java-Themen 16
hdi Javadoc Comments: IllegalArgumentException deklarieren? Allgemeine Java-Themen 3
D Array oder Vector in Enum Deklarieren Allgemeine Java-Themen 3
B Volatile Frage: Reicht es nur den Singleton als volatile zu deklarieren? Allgemeine Java-Themen 4
S Statische Methoden in abstrakte Klassen deklarieren? Allgemeine Java-Themen 17
A Als FINAL deklarieren -> sinnvoll? Allgemeine Java-Themen 16

Ähnliche Java Themen

Neue Themen


Oben