Methoden Argument und this



  • Hallo.

    Also, wenn ich eine Methode aufrufe, und ein Objekt bzw. ein primitiver Datentyp als Argument übergeben wird, wird doch eine Kopie des Arguments erstellt und diese dann in der Methode verwendet.

    Wie ist das nun, wenn ich den this-Zeiger übergebe?
    Also ein Beispiel:

    class RechenUndSpeicherIntensiveKlasse {
    ...
    }

    Und hier eine Methode der anderen Klasse:

    public final void führeEineRechenUndSpeicherIntensiveAktionAus(RechenUndSpeicherIntensiveKlasse rusik) {
    rusik.führeDieseRechenUndSpeicherIntensiveMethodeAus();
    rusik.führeJeneRechenUndSpeicherIntensiveMethodeAus();
    }

    Also, es wird doch hier eigentlich ein Zeiger übergeben, oder? Also keine Kopie des Objektes, auf welches er zeigt, sondern der Zeiger.
    Ich möchte mir hier rüber eben Gewissheit verschaffen, weil diese Klasse eben, wie es schon im Namen steht, recht Speicherintensiv ist und es in dem Fall recht unpraktisch wäre, jedes Mal eine Kopie des Objektes zu nutzen, da diese Methoden auch noch ziemlich häufig benutzt werden.



  • primitive Typen werden als Kopie übergeben,
    Objekte von Klassentypen sowie Strings und Arrays als Referenzen.



  • Objekte von Klassentypen sowie Strings und Arrays als Referenzen.

    [KLUGSCHEISSER]
    das mit den Strings und Arrays kommt daher das das auch Objekte von Klassen sind. 😃

    [/KLUGSCHEISSER]



  • Original erstellt von Pogo:
    **
    public final void führeEineRechenUndSpeicherIntensiveAktionAus(RechenUndSpeicherIntensiveKlasse rusik) {
    rusik.führeDieseRechenUndSpeicherIntensiveMethodeAus();
    rusik.führeJeneRechenUndSpeicherIntensiveMethodeAus();
    }
    **

    OT: Dem Entwickler solcher Methoden-Namen sollte
    mann ein 2kg schweres Code Stil Buch um die Ohren schlagen

    😉



  • 😃

    Also wie auch immer, ich denke ich hab´s kapiert.

    Ok, hier eine Frage:

    Da wir gerade bei Speicherintesität sind, jetzt mal was, was im weitesten Sinn damit zu tun hat. Also, ich habe von einem Bekannten gehört, das er in einem Buch von olle LaMothe gelesen hätte, dass man alle Datenstrukturen in c++ mögl. so großen Speicher reservieren lassen sollte, dass dieser ein vielfaches von 8 ist, da das dann eine Geschwindigkeitssteigerung bedeuten würde. Stimmt das?
    (Also es hat jetzt was mit Java zu tun, denn ich denke, wenn das stimmt, sollte es in Java nicht unbedingt anders sein)



  • Ich glaub, das kannst Du getrost vergessen. Ums Alignment kuemmern sich heutige Compiler / VMs von alleine.



  • Original erstellt von SG1:
    Ich glaub, das kannst Du getrost vergessen. Ums Alignment kuemmern sich heutige Compiler / VMs von alleine.

    Nach allem wa sich in C-Optimierungsgeschichten gelesen habe, gilt das zumindest für C/C++ noch nicht. Wäre auch im prinzip nicht unbedingt erwünscht. Stell dir vor du baust eine Struktur im Speicher und hast ein Array davon und willst Pointerjonglieren machen um an deine Daten zukommen. Da kann so ne implizite Optimierung viel kaputt machen. Von daher macht das ein Compiler für C denke ich eher weniger.

    In Java istdie ganez Sache sowieos uninteressant, weil du absolut keine Möglichkeit hast, den Speicher irgendwie selber zu reservieren. Auch bei Klassen fällt immer noch ein interner Zusatzaufwand an, den man nicht einschätzen kann. Ich denke da kann man getrost wie SG1 das sagt, sich auf die VM verlassen. Sinn von Java ist ja gerade, dass du dich mit sowa snicht beschäftigen musst 🙂 (Wäre sonst ein Schritt richtung Plattformabhängigkeit. Denn wenn das ganze plötzlich auf einer Maschine läuft, wo ein Maschinenwort nicht 32 oder 64 Bit lang ist sondern 60, ist das ganze sowieso hinfällig. Und man weiß nie wos uns noch hinführt :))



  • Mhh, naja ok. Schade eigentlich, denn Java hat wirklich Geschwindigkeitsprobleme. Aber ich denke/hoffe bei dieser rasanten Entwicklung der Maschinen wird das Geschwindigkeitsmanko Javas gegenüber anderer Sprachen nicht mehr so ins Gewicht fallen.


  • Mod

    Original erstellt von Pogo:
    Schade eigentlich, denn Java hat wirklich Geschwindigkeitsprobleme.

    Naja, sooo große Geschwindigkeitsprobleme hat Java nicht. Javacode kann durchaus sehr schnell sein, muss er aber natürlich nicht.

    Weiß jemand, was man vermeiden sollte und was man tun sollte, damit Javacode schnell ist? Was macht Java langsam (Ich vermute einfach mal, dass es zu nem Großteil an den Sicherheitskonzepten liegt)?

    BTW: Ist die IBM JVM tatsächlich deutlich schneller, als die SUN JVM? Hat jemand Erfahrung mit der IBM JVM?



  • Original erstellt von Gregor:
    Weiß jemand, was man vermeiden sollte und was man tun sollte, damit Javacode schnell ist? Was macht Java langsam (Ich vermute einfach mal, dass es zu nem Großteil an den Sicherheitskonzepten liegt)?
    [/QB]

    Ja, im Prinzip machen die Sicherheitskonzepte Java am ehesten langsam, denn häufig ausgeführter Code wird ja sowieso Just-In-Time kompiliert und das Interpreterargument fällt aus. Von daher ist es ansich sehr praktisch, wenn der Code ein bisschen schon so ist, dass die Optimierungen greifen oder die Sicherheitschecks unnötig werden:

    - Arraygrenzen-Prüfung (vermeidbar durch wenige oder exakt vorbestimmte Arrayzugriffe)
    - null-Prüfung (vermeidbar indem keien Situation bleibt wo ein Objekt null sein kann)
    - Schleifenentfaltung (machbar, indem man Schleifen so konstruiert, dass sie einfiach zu entfalten sind)
    - Schleifeninvarianten (aus Schleifen alles rausziehen, was nicht von der Zählvariable abhängt)
    - Berechnete Ausdrücke wiederverwenden

    Diese Optimierungen gelten allerdings nur für die Server-Variante vom Hotspot ausm JDK, also ausgeführt per java -server

    **
    BTW: Ist die IBM JVM tatsächlich deutlich schneller, als die SUN JVM? Hat jemand Erfahrung mit der IBM JVM?**

    Ich hab sie selber auch nie benutzt, aber der Volano-Report testet die VMs regelmäßig: http://www.volano.com/report/index.html

    Dort zeigt sich: In der Anwendung ist die IBM-VM schneller, kann also wohl schneller rechnen, aber wie sich weiter unten zeigt, skaliert sie auf Netzanwendungen grausam.


  • Mod

    Original erstellt von TriPhoenix:
    aber wie sich weiter unten zeigt, skaliert sie auf Netzanwendungen grausam.

    Naja: Zumindest skaliert sie nicht schlechter, als die Sun-JVM! ...offensichtlich haben die native-Compiler da nen größeren Vorteil.

    ...außerdem scheint der Report nicht mehr so aktuell zu sein. Es wird nichtmal die Sun JVM 1.4 getestet.

    [ Dieser Beitrag wurde am 25.03.2003 um 15:03 Uhr von Gregor editiert. ]


Anmelden zum Antworten