Re: wie Array für statische Methoden
- From: "Erik G." <vikinger@xxxxxx>
- Date: Sun, 29 Jan 2006 18:25:10 +0100
Hallo Jochen Theodorou,
ich hab ein kleines Utility-Package und darin sind ungefähr ein Drittel aller Methoden static z.B. 'public static final InetAddress[] getAllLocalIPs()'. Warum sollte ich so eine Methode nicht static machen?
.... schon wenn die Methode "getAllHostIPs()" heissen würde fände ich es sinnvoll das nicht mehr static zu machen. Denn die IP kann durch Portforwarding zustande gekommen sein.
Die von mir genannte Methode liefert alle IP-Adressen vom Computer auf dem sie aufgerufen wird, natürlich kann sich das während der Programmlaufzeit ändern aber darauf hat das Java-Programm normalerweise keinen Einfluss also warum nicht static? Was anderes wäre es wenn sich das Programm benachrichtigen lassen könnte dann würd ich diese Information auch nicht einfach in einem Array zurückgeben sondern ein Objekt abliefern das diese Info über ein Interface anbietet so das der eigentliche Programcode immer aktuelle Informationen hat. Das mit dem Portforwarding verstehe ich nicht ganz, dadurch bekommt der Host doch keine weitere IP-Adresse sondern ist von außen nur durch eine weitere erreichbar und wenn das Protforwarding in einem NAT-Router erledigt wird merkt der Host ja noch nicht einmal was davon, der NAT-Router ändert ja schließlich die Zieladresse von entsprechend eingehenden Paketen auf eine vom gewünschten Host um.
ich bin mit static wohl etwas großzüger als Du aber deswegen bestimmt nicht fixiert
sagst du, aber dann kommt sowas:
Wenn Du die Methoden meinst die vom Dispatcher-switch aufgerufen werden dann nein. Aber welcher Vorteil entsteht wenn sie nicht static sind?
Trotzdem bin ich nicht auf static "fixiert". Wenn die entsprechenden Kriterien, über die wir uns wohl einigermaßen einig sind, zutreffen dann benutze ich diesen Modifier eben auch, sonst nicht.
>> Aber welcher Vorteil entsteht wenn sie nicht static sind?
bis jetzt konnte ich noch keinen Erkennen
Für mich klingt das nach einer Fixierung.
Aha, ich will ja hier nicht unhöflich oder undankbar sein aber diese absoluten Ferndiagnosen mag ich nicht.
welcher Nachteil entsteht denn wenn du die Methoden *nicht* static machst?
Man benötigt für nicht statische Methoden eine Instance von der entsprechenden Klasse und die Kostet auf jeden Fall Speicher selbst wenn es keine lokalen Variablen gibt. Die Referenz, die der Aufrufer braucht, kostet auch Speicher, klar ist das alles sehr wenig aber die Menge machts, vor allem bei mehreren Aufrufern, und wenn man, so wie ich, es gewohnt ist jedes einzelne Byte zu zählen dann kennt man die meisten dieser Verschwender und versucht diese von Anfang an zu vermeiden. Gerade wenn es mehrere Aufrufer gibt und die immer wieder eine Instace von der Klasse erstellen müssen nur um eine simple Utility-Methode aufzurufen dann belastet das bei Java ja auch noch den GC.
Beim großen Dispatcher-switch käme noch ein Problem: wenn ich die eigentlichen Arbeitsmethoden, als nicht static, über etwa 30 Klassen verteile (wegen der Übersicht) dann braucht der Dispatcher von allen eine entsprechende Instance und genau da sehe ich eben nur Kosten (Speicher und CPU) und keinen Vorteil also fällt mir die Entscheidung, static oder nicht static, ziemlich leicht.
Das sit jetzt aber der völlig falsche Weg. Zu frühzeitige Performanceüberlegungen schaden nur.
Welchen Stellenwert Performanceüberlegungen haben hängt IMHO ganz von der Aufgabenstellung ab so das ich mich hier mit voreiligen Behauptungen eher zurückhalten würde.
Da wird dann oft ein anderer Algorithmus (der komplizierter ist) genommen oder sonst irgendwelche verschlimmbesserungen
das sowas vorkommt weis ich auch
Weil ich vor genau einer solchen Entscheidung stand habe ich diesen Thread eröffnet, schließlich wollte ich wissen was es noch für Möglichkeiten gibt, die mir selber noch nicht eingefallen sind, und was die jeweils für Vor- und Nachteile haben. Ich denke die Antworten in diesem Thread haben mir alle nötigen Informationen gegeben und momentan tendiere ich eindeutig in die Richtung welche ich gestern Abend beschrieben hab.
Zum Beispiel habe ich gerade folgendes getestet:
private long addp(long a, long b) { return a+b; }
private static long adds(long a, long b) { return a+b; }
Bei 'private' kann ich mir verschiedenes vorstellen da für den Methodenaufruf 'this' nicht extra behandelt werden muss aber wenn der Aufruf von einer anderen Klasse kommt dann muss die Referenz auf das Objekt mit 'addp' erst mal irgendwo her geholt werden und das ist ja das Szenario das ich hab.
bei anfänglichen Messungen war adds ca. 8% schneller als addp, dann habe ich die Messung verlängert und plötzlich ist addp 10% schneller als adds (bei 10.000.000.000 Druchläufen).
auf Deinem Rechner, mit Deiner JVM, ...
Versteh mich bitte nicht falsch, ich finds gut das Du selber gemessen hast, aber es gibt eben noch mehr Randbedingungen.
Wie erklärst Du Dir eigentlich das Überholen von 'addp'?
ein Programm hat normalerweise grössere Probleme als Performanceverlust bzw. -gewinn durch ändern einens Modifier!
Das weis ich auch, aber es ist auch nur selten so leicht was an der Performace zu ändern wenn man nur einen "geeigneteren" Modifier benutzen braucht.
Grüße Erik .
- Follow-Ups:
- Re: wie Array für statische Methoden
- From: Jochen Theodorou
- Re: wie Array für statische Methoden
- References:
- wie Array für statische Methoden
- From: Erik G.
- Re: wie Array für statische Methoden
- From: Alfred
- Re: wie Array für statische Methoden
- From: Erik G.
- Re: wie Array für statische Methoden
- From: Jochen Theodorou
- Re: wie Array für statische Methoden
- From: Erik G.
- Re: wie Array für statische Methoden
- From: Jochen Theodorou
- Re: wie Array für statische Methoden
- From: Erik G.
- Re: wie Array für statische Methoden
- From: Jochen Theodorou
- Re: wie Array für statische Methoden
- From: Erik G.
- Re: wie Array für statische Methoden
- From: Jochen Theodorou
- Re: wie Array für statische Methoden
- From: Erik G.
- Re: wie Array für statische Methoden
- From: Jochen Theodorou
- Re: wie Array für statische Methoden
- From: Erik G.
- Re: wie Array für statische Methoden
- From: Jochen Theodorou
- Re: wie Array für statische Methoden
- From: Erik G.
- Re: wie Array für statische Methoden
- From: Jochen Theodorou
- Re: wie Array für statische Methoden
- From: Erik G.
- Re: wie Array für statische Methoden
- From: Jochen Theodorou
- Re: wie Array für statische Methoden
- From: Erik G.
- Re: wie Array für statische Methoden
- From: Jochen Theodorou
- wie Array für statische Methoden
- Prev by Date: Re: Konzept eigener Thread Scheduler in Java
- Next by Date: Re: =?UTF-8?B?QW5mw6RuZ2VyZnJhZ2U=?= zum Verlassen von Methoden
- Previous by thread: Re: wie Array für statische Methoden
- Next by thread: Re: wie Array für statische Methoden
- Index(es):
Relevant Pages
|
Loading