Wieviel kostet der Zugriff auf Objektattribute im Vergleich zur Erstellung von vars in Methode?

Geek

Mitglied
Was ist performancemäßig teurer:
Java:
class A {
  final int var = 42;
  
  void aufrufer(){
     for (int i = 0; i <= 10000000; i++){
         int irgendwas = aendertSichDauernd();
         rufeAuf(irgendwas);
     }
  }

  void rufeAuf(int irgendwas){
       // greife auf var zu, z.B.
       irgendwas = irgendwas - var;      
  }
}

vs.
Java:
class B {
  
  void aufrufer(){
     for (int i = 0; i <= 10000000; i++){
         int irgendwas = aendertSichDauernd();
         rufeAuf(irgendwas);
     }
  }

  void rufeAuf(int irgendwas){
       final int var = 42;
       irgendwas = irgendwas - var;      
  }
}

In Beispiel A wird var einmal initalisiert, aber dann ein paar Mio mal darauf von der Methode aus zugegriffen.

In Beispiel B wird var bei jedem Aufruf der Methode neu erzeugt und das ebenfalls ein paar Mio mal.

Es kann sein, dass das Schlüsselwort final noch weg kommt, wie würde es dann aussehen?
 

Viktim

Bekanntes Mitglied
Theoretisch kannst du das alles Selber ausprobieren und Testen...
Guck dir mal den Befehl: 'System.currentTimeMillis();' an. wenn du den am anfang und am ende von deinem Programm einbaust und dann einfach Minus rechnest, kriegst du ja die Zeit raus, die das brauchte... ;)
 

JStein52

Top Contributor
Ich denke mal sowas ist keine Frage was länger dauert oder mehr kostet sondern eine Designfrage. Wenn var eine Eigenschaft der Instanz ist dann ist es eine Instanzvariable, wenn var eine temporäre Variable ist die du in einer Methode mal brauchst um irgendwas rumzurechnen dann ist es eine lokale Variable.
 

Viktim

Bekanntes Mitglied
okay ich hätte gesagt, dass das obere die bessere Lösung ist, vorrausgesetzt du machst var noch private und rufst die Methode rufeAuf() öfter als einmal auf.

Bei der Unteren lösung legst du die Variable halt bei jedem Methodenaufruf neu an, wärend du sie beim oberen Bespiel nur einmal anlegst, und nurnoch aufrufst...
 

Thallius

Top Contributor
Wenn Du den oben geposteten Code testest, sollte der zweite schneller sein. Weil der Compiler/Interpreter erkennt, dass var nur einmal benötigt wird und gar keine Variable dafür anlegt sondern es dirkt kodiert so das ein

Code:
irgendwas = irgendwas - 42;

daraus wird.

Gruß

Claus
 

InfectedBytes

Top Contributor
allerdings ist der zugriff auf eine lokale variable performanter als der Zugriff auf eine Instanzvariable.
In Fällen wie diesen, ist der Compiler allerdings auch schlau genug, um beides zu optimieren.
In beiden Fällen würde der Compiler direkt mit dem Wert 42 rechnen, ohne die Variable zu benutzen.
Hier einmal der generierte Bytecode (beide Fälle erzeugen die gleiche rufeAuf methode)
Code:
iload_1 // parameter 'irgendwas' auf den Stack legen
bipush 42 // 42 auf den Stack legen
isub // zwei Werte vom Stack nehmen, subtrahieren und Ergebnis auf den Stack legen
istore_1 // Ergebnis in variable 'irgendwas' speichern
return
 

Geek

Mitglied
Ich danke euch für eure Antworten.

Ja, das habe ich gar nicht bedacht, da habt ihr alle Recht, der Compiler dürfte es in beiden Fällen wegoptimieren. Von daher wäre es aus Performancesicht egal, welche Variante man nimmt.

Wie würde es aber aussehen, wenn die Variable nicht wegoptimiert werden würde/könnte?
Wäre dann die Erzeugung einer lokalen Variabler performanter oder der Zugriff auf eine Instanzvariable?

2 Beispiele:


Java:
class C {
  private int var;

  void aufrufer(){
     int nochwas = aendertSichAuchDauernd();
     int nochwas2 = aendertSichAuchDauernd();
     this.var = 42 + nochwas * nochwas2;
     for (int i = 0; i <= 10000000; i++){
         int irgendwas = aendertSichDauernd();
         rufeAuf(irgendwas);
     }
  }

  void rufeAuf(int irgendwas){
       // greife auf var zu, z.B.
       irgendwas = irgendwas - var;
  }
}

Java:
class D {
  void aufrufer(){
     int nochwas = aendertSichAuchDauernd();
     int nochwas2 = aendertSichAuchDauernd();
     for (int i = 0; i <= 10000000; i++){
         int irgendwas = aendertSichDauernd();
         rufeAuf(irgendwas, nochwas, nochwas2);
     }
  }

  void rufeAuf(int irgendwas, int nochwas, int nochwas2){
       int var = 42 + nochwas * nochwas2;
       irgendwas = irgendwas - var;
  }
}

Ist das Erzeugen einer lokalen Variable schneller als der Zugriff auf eine Instanzvariable?
Das Objekt landet ja auf dem Heap, da liegt meines Wissens nach, sofern ich mich nicht irre, also auch die Instanzvariable. Die lokale Variable wird dagegen auf dem Stack erzeugt.

Letzteres könnte z.B. in einem Register landen und ersteres zu einem teuren Speicherzugriff führen, so meine Vermutung.

EDIT:
Zugegeben, die Multiplikation mit den zwei nochwas Variablen ist unschön, bzw. verfälscht das Ergebnis, im Grunde wollte ich für das Beispiel auch nur die Erzeugung einer lokalen Variable in der Methode erzwingen, damit nicht mit einer Referenz weitergerechnet wird, daher ein verbessertes Beispiel:


Java:
class E {
  private int var;

  void aufrufer(){
     for (int i = 0; i <= 10000000; i++){
         int nochwas = aendertSichAuchDauernd();
         int nochwas2 = aendertSichAuchDauernd();
         this.var = 42 + nochwas * nochwas2;
         int irgendwas = aendertSichDauernd();
         rufeAuf(irgendwas);
     }
  }

  void rufeAuf(int irgendwas){
       // greife auf var zu, z.B.
       irgendwas = irgendwas - var;
  }
}

Java:
class F {
  void aufrufer(){
     for (int i = 0; i <= 10000000; i++){
         int nochwas = aendertSichAuchDauernd();
         int nochwas2 = aendertSichAuchDauernd();
         int irgendwas = aendertSichDauernd();
         rufeAuf(irgendwas, nochwas, nochwas2);
     }
  }

  void rufeAuf(int irgendwas, int nochwas, int nochwas2){
       int var = 42 + nochwas * nochwas2;
       irgendwas = irgendwas - var;
  }
}

EDIT2:
Okay, die beiden Beispiele E und F sind auch nicht wirklich geeignet. Mir ist gerade aufgefallen, dass ich auf die Instanzvariable ja mehrfach in der Schleife zugreife, womit man da nicht mehr viel gegenüber der lokalen Variable in Bsp. F gewinnen würde.
Mir fällt aber gerade kein besseres bzw. anderes Beispiel ein, um das worauf ich hinaus will, etwas genauer zu konkretisieren.
 
Zuletzt bearbeitet:

Flown

Administrator
Mitarbeiter
Was ist wirklich dein Problem?

Es dürfte hier für den Menschen keinen Unterschied machen, ob eine Instanzvariable oder lokale Variable geladen wird! Das liegt hier im Nanosekundenbereich. Auch weiß man nie was der Compiler macht - wie auch in dem obigen Beispiel verdeutlicht - ob er jetzt auch noch den JIT Compiler anschmeisst.
Die Frage sollte eher lauten, was ist leselicher und was macht mehr Sinn!

Wenn es sich um eine akademische Frage lautet, dann kann man sagen, dass lokale Variablen (auch Konstanten: static final) gleich schnell geladen werden (Was auch wieder auf die JVM ankommt).
 

Baldur

Aktives Mitglied
Rein theoretisch dürfte der Zugriff auf eine Objektvariable teurer sein, da das Programm ja erst mal über "this" (bzw. die Objektreferenz) ermitteln muss wo das Objekt überhaupt im Speicher liegt, und dann von dort aus auf die Objektvariable zugreifen. Bei einer lokalen Variable entfällt das und es kann direkt auf den Wert zugegriffen werden.

Ansonsten würde ich Flown uneingeschränkt zustimmen. Im Zweifelsfall IMMER das schreiben was lesbarer ist. Ich kenne keinen Fall, bei dem ein Variablenzugriff ein Programm messbar ausgebremst hätte. Der Unterschied dürfte jedenfalls so gering sein, daß du ihn bestenfalls mit Profiler-Werkzeugen erkennst.
Compiler sind heutzutage wirklich verdammt gut darin, solchen Kleinkram zu optimieren. Da kommt man selbst mit handoptimiertem Assemblercode kaum noch ran. Also lieber den einfacheren, lesbareren Code schreiben, und dem Compiler die Drecksarbeit machen lassen ;)
 

mrBrown

Super-Moderator
Mitarbeiter
Das einzige was mir dazu einfällt:
"Programmers waste enormous amounts of time thinking about, or worrying about, the speed of noncritical parts of their programs, and these attempts at efficiency actually have a strong negative impact when debugging and maintenance are considered. We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil. Yet we should not pass up our opportunities in that critical 3%." - Don Knuth
 

Geek

Mitglied
Danke für eure Antworten. Ja, es war auch mehr eine akademische Frage falls ich mal in so eine Situation geraten sollte und ich zig Aufrufe haben dieser Art haben sollte.
 

Flown

Administrator
Mitarbeiter
Also wenn es rein akademischer Natur ist, dann würde ich es so wie die JDK-Entwickler machen. Den ganzen (globalen) Instanzkontext in lokale Variablen am Anfang holen und dann eben die Sachen bearbeiten (kann man gut in den Collectionsklassen sehen). Aber VORSICHT! die meisten haben sehr viel Ahnung was dann im Hintergrund geschehen kann und wird. Damit meine ich sie erleichtern den Compiler gewisse Sachen zu optimieren. Wann, wo und wie sowas erleichtert wird hängt ganz von der Compilerimplementierung ab und erfordert sehr viel Erfahrung und Wissen. Fazit: immer lesbaren Code schreiben und keine Optimierung selbst schreiben.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Grundsatzfrage: Belegt eine Referenz auf 'null' RAM, und wenn ja - wieviel ;-) ? Java Basics - Anfänger-Themen 5
T Wieviel Array-Elemente Java Basics - Anfänger-Themen 19
L Wieviel Speicher braucht ein Pixel? Java Basics - Anfänger-Themen 14
M Aus wieviel Klassen darf in Java eine (Programm)besitzen? Java Basics - Anfänger-Themen 21
C Zeitberechnungen wieviel Zeit vergangen ist. Java Basics - Anfänger-Themen 4
L Wieviel Platz belegt Java standardmäßig im Arbeitsspeicher? Java Basics - Anfänger-Themen 4
A wieviel platz ist noch frei? Java Basics - Anfänger-Themen 2
G Wieviel Speicher verbraucht ein Array? Java Basics - Anfänger-Themen 7
I In unterschiedlichen Applikation Zugriff auf eine gemeinsame Anwendung? Java Basics - Anfänger-Themen 8
C Zugriff auf Methode Java Basics - Anfänger-Themen 2
I Applikationsserver (WildFly) - Zugriff auf Ressourcen.. Problem mit Pfade Java Basics - Anfänger-Themen 10
J Zugriff auf eine 2. Klasse die per UI-Designer erstellt wurde Java Basics - Anfänger-Themen 1
Encera Zugriff auf Map-Objekte Java Basics - Anfänger-Themen 3
T Zugriff auf Control anderer Klasse Java Basics - Anfänger-Themen 5
W Unterschiede bei Zugriff auf Objekt und Klassenvariablen über einen Getter? Java Basics - Anfänger-Themen 2
EchtKeineAhnungManchmal hallo habe ein Problem mit einer Datei -> (Zugriff verweigert) Java Basics - Anfänger-Themen 4
R TreeSet Zugriff aus anderer Klasse Java Basics - Anfänger-Themen 8
C Kein Zugriff auf Klassenmethoden in Main Methode Java Basics - Anfänger-Themen 23
H Zugriff verweigert Java Basics - Anfänger-Themen 5
moiss002 Umgebungsvariable Kein Zugriff auf ein Array Java Basics - Anfänger-Themen 7
B Probleme mit Zugriff auf Dateisystem Windows 10 ( jFileChooser) Java Basics - Anfänger-Themen 17
B Zugriffsmodifier, Zugriff außerhalb Package Java Basics - Anfänger-Themen 5
C Zugriff auf Attribut von Oberklasse Java Basics - Anfänger-Themen 8
P Klasse hat keinen Zugriff auf getter/setter-Methoden eines Objektes Java Basics - Anfänger-Themen 9
B Methoden Methoden haben kein Zugriff auf variablen Java Basics - Anfänger-Themen 4
M Gettter/Setter Methoden Klassenfelder kapselung und zugriff? Java Basics - Anfänger-Themen 1
S Zugriff auf protected Fields = guter Programmierstil? Java Basics - Anfänger-Themen 11
M Pfadprobleme - Zugriff auf einen Ordner im Workspace Java Basics - Anfänger-Themen 17
ruutaiokwu Bluetooth-Zugriff, braucht es dazu plattformabhängige Libraries oder kann das Java mittlerweile selbst? Java Basics - Anfänger-Themen 10
R Zugriff auf den Index eines Arrays, welches ein Objekt ist. Java Basics - Anfänger-Themen 4
M Zugriff auf eine ArrayList in einer anderen Klasse Java Basics - Anfänger-Themen 4
P Zugriff auf Variablen anderer Klassen in Greenfoot Java Basics - Anfänger-Themen 1
L Methoden Zugriff <identifier> expected Java Basics - Anfänger-Themen 13
T Java - Zugriff nur mit CLASSPATH ? Java Basics - Anfänger-Themen 7
B Klassen Zugriff auf ein Objekt einer Klasse aus einer Methode heraus Java Basics - Anfänger-Themen 4
L Zugriff auf Attribute eins Objekts über ActionListener Java Basics - Anfänger-Themen 4
D Zugriff auf Methode einer anderen Klasse Java Basics - Anfänger-Themen 5
S Zugriff auf Objekt Java Basics - Anfänger-Themen 5
A Klassen Zugriff auf Instanzen Java Basics - Anfänger-Themen 2
N ArrayList in eigener Klasse erzeugen mit Zugriff Java Basics - Anfänger-Themen 7
J Zugriff auf Variable in anderem Programm Java Basics - Anfänger-Themen 5
Q Zugriff auf Attribute Java Basics - Anfänger-Themen 3
J Klassen Zugriff auf ein "String Array" Java Basics - Anfänger-Themen 6
H Datentypen ArrayList in ArrayList: Zugriff Java Basics - Anfänger-Themen 6
J get methoden zugriff und objekt erzeugung Java Basics - Anfänger-Themen 30
J Datenbank Zugriff Java Basics - Anfänger-Themen 24
T Zugriff auf JCheckBox Java Basics - Anfänger-Themen 8
E Netzlaufwerk Zugriff schlägt fehl Java Basics - Anfänger-Themen 11
C Group, Actor und Instanz-Zugriff, LibGDX Java Basics - Anfänger-Themen 4
S Zugriff auf Attribut einer unbekannten Klasse erhalten Java Basics - Anfänger-Themen 6
R Methoden Methode der GUI-Klasse Zugriff auf Methoden der Hauptklasse Java Basics - Anfänger-Themen 9
S Vererbung Zugriff auf die Basisklasse einer "zweiten" Erweiterungsklasse Java Basics - Anfänger-Themen 2
Z Threads Threads - Zugriff auf Ressourcen ohne(Lock, Synchronized) Java Basics - Anfänger-Themen 2
S Vererbung Zugriff auf Methode funktioniert nicht (static/non-static) Java Basics - Anfänger-Themen 3
F Klassen Zugriff auf verschachtelte Objekte Java Basics - Anfänger-Themen 11
J Sichtbarkeit und Zugriff Java Basics - Anfänger-Themen 9
L Zugriff auf zwei Java-Quellcodes Java Basics - Anfänger-Themen 3
A OOP Zugriff auf Objekte von außen Java Basics - Anfänger-Themen 8
M Kapselung Datenkapselung Sinn direkter Zugriff? Java Basics - Anfänger-Themen 1
G Methoden Zugriff auf Methode.. aus einer anderen Klasse Java Basics - Anfänger-Themen 6
J JDialog Zugriff auf parent JDialog Java Basics - Anfänger-Themen 5
K Collections Zugriff auf ein bestimmtes Element in der Collection Java Basics - Anfänger-Themen 1
K ArrayList in Konstruktor - wie späterer Zugriff Java Basics - Anfänger-Themen 2
F Zugriff auf Objekt einer anderen Klasse Java Basics - Anfänger-Themen 7
P Zugriff auf Felder in ArrayList Objekten Java Basics - Anfänger-Themen 2
J Erste Schritte Zugriff auf Eigenschaft Java Basics - Anfänger-Themen 2
M MVC - Problem mit Zugriff auf Objekt Java Basics - Anfänger-Themen 4
D Zugriff auf von einer anderen Klasse erstellten Objekten Java Basics - Anfänger-Themen 5
C 5 - Zugriff verweigert Java Basics - Anfänger-Themen 1
K Zugriff auf Variabeln Wert einer Instanz Java Basics - Anfänger-Themen 4
A Methoden Zugriff auf eingelesene Variablen in der main Methode (ohne Änderung der Parameterliste) Java Basics - Anfänger-Themen 4
Z Methoden Zugriff mit Klasse 3 auf Methode von Klasse 2 welche in Klasse 1 erzeugt wird Java Basics - Anfänger-Themen 6
Z Zugriff auf andere Methoden Java Basics - Anfänger-Themen 12
Z Zugriff auf Pakete Java Basics - Anfänger-Themen 5
G Zugriff zwischen Klassen Java Basics - Anfänger-Themen 15
N Problem mit Swing Textfeld und Zugriff aus anderer Klasse Java Basics - Anfänger-Themen 6
H Kein Zugriff auf das Element einer JList möglich: Fehlermeldung Java Basics - Anfänger-Themen 2
W OOP Zugriff auf mit Objekt erstellte Struktur Java Basics - Anfänger-Themen 7
F Klassen Zugriff auf Fenster aus versch. Klassen Java Basics - Anfänger-Themen 5
M Variablen Zugriff von außerhalb eines Blockes auf eine Variable innerhalb eines Blockes Java Basics - Anfänger-Themen 2
U Methoden Zugriff auf Array von weiterer Methode einer Klasse, Rückgabewert Problem Java Basics - Anfänger-Themen 5
B Klassen Zugriff auf Daten der Child-Klasse Java Basics - Anfänger-Themen 9
W Typisierte ArrayList und der Zugriff auf den Typ Java Basics - Anfänger-Themen 5
M Zugriff auf Klasse Java Basics - Anfänger-Themen 2
K Zugriff auf C: Java Basics - Anfänger-Themen 5
S Das richtige Format für den SOAP Zugriff Java Basics - Anfänger-Themen 0
S Klassen Zugriff auf Attribute einer zweiten Klasse, welche durch dritte gesettet wurden? Java Basics - Anfänger-Themen 2
N Zugriff bei Package Struktur Java Basics - Anfänger-Themen 6
M Enum: Zugriff auf Konstanten Java Basics - Anfänger-Themen 7
V Zugriff auf jProgressbar Java Basics - Anfänger-Themen 10
B Zugriff auf csv-Datei per hashmap Java Basics - Anfänger-Themen 5
G Spalte in JTable unsichtbar machen, Zugriff auf Daten ermöglichen Java Basics - Anfänger-Themen 2
T ZUgriff auf 'Werte' Java Basics - Anfänger-Themen 3
J Vererbung Zugriff auf private Variable Java Basics - Anfänger-Themen 10
C Klassen Zugriff auf Objekt anderer Klasse Java Basics - Anfänger-Themen 8
B Methoden Zugriff auf Variable ermöglichen Java Basics - Anfänger-Themen 3
M Zugriff auf Arraylist Java Basics - Anfänger-Themen 7
D Kein Zugriff auf JFrame Java Basics - Anfänger-Themen 2
K Zugriff einer Klasse auf eine andere Andere -> bad operand for binary operator Java Basics - Anfänger-Themen 5
B Erste Schritte Array-Zugriff Java Basics - Anfänger-Themen 10

Ähnliche Java Themen

Neue Themen


Oben