'kosten' Parameter?

B

BioBrause

Gast
Hallo,
ich bin gerade dabei,
eine kleine Simulation zu basteln.
Dabei werden mir pro logic-update viele Vectorn erstellt, und dan dem gc zum fraße vorgeworfen.
Um das erstellen so vieler Objekte, welche nur für ein-zwei Rechnungen gebrauccht werden, zu verhindern bin ich jetzt dazuübergegengen, ein 'Arbeits-Object' rumzugeben.
Also anstadt:
Java:
public class foo{
Vector3 blub = new Vector3(3,3,3);
public void ba(){
Vector3 v = new Vector3();
v.add(blub);
v.fooba();
blub.foobaba();
}
}
eher
Java:
public class foo{
Vector3 blub = new Vector3(3,3,3);
public void ba(Vector3 v){
v.zero();
v.add(blub);
v.fooba();
blub.foobaba();
}
}
Meine Frage ist eigentlich rein Theoretisch, da die zeit recht klein sein dürfte, aber kosten mehr Parameter mehr zeit?
Ich vermute ein gaaaaaaaanz bisschen mehr.
Danke an alle, die sich das durchgelesen haben ;)
 

Marco13

Top Contributor
Theoretisch, vielleicht - wissen tu' ich es nicht.

Aber zur eigentlichen Intention: Ich habe auch (noch?) die Tendenz, solche vielen kleinen Objektallokationen zu vermeiden. Die waren früher mal teuer. Erstens wegen der Allokation an sich, und nicht zuletzt auch, weil der GC sich dann einen Wolf collectet hat.

Heutzutage (spätestens seit Java 7) ist das aber eigentlich nicht mehr sooo kritisch: Die JVM verwendet "Escape Analysis", um festzustellen, ob ein Objekt "eine Methode verlassen kann". Wenn es die Methode NICHT verlassen kann, wird es auf dem Stack allokiert statt auf dem Heap. D.h. es ist schnell, der GC wird nicht belastet, und Method Inlining beim JIT schmeißt noch ein paar weitere potentielle Overheads weg. Websuchen zu sowas wie "Escape Analysis Java" liefern da viele Ergebnisse.

Das soll keine Empfehlung sein, die vorgesehene "Optimierung" NICHT zu machen, nur ein Hinweis, dass man das kritisch (mit einer neuen VM) testen sollte, und es heutzutage eher mal sein kann, dass der Trade-Off zwischen "schöner API" und "effizientem Code" machmal kleiner wird, und man so einen zusätzlichen Parameter vielleicht nicht mehr einfügen muss, wenn es wirklich eine reine Optimierung sein soll, bei der man etwas zähneknirschend denkt: "Naja, anders wäre schöner..." - vielleicht lohnt es sich nicht. Nebenbei: Wenn Brian Goetz schon auffordert: Write Dumb Code könnte da ja was dran sein ;)
 
B

BioBrause

Gast
Dann lasse ich es erstmal weg.
Sowas kann man später immer noch machen und es gefällt mir außerdem nicht. ;)
------
Nur indirekt eine Antwort auf meine Frage, aber trotzdem interessant.
Sowohl das Interview, oder besser gesagt: der Monolog, wie auch das Stichwort "Escape Analysis".
Da lernt man wider, ohne am Morgen damit gerechnet zuhaben.
Vielen Dank und schönen tag noch (extra bis nach mitternacht gewartet, um nicht so geizig zu erscheinen :bae:).

BioBrause
 

schalentier

Gesperrter Benutzer
Die Frage ist doch eher, wie macht man es, WENN ein Objekt die Methode verlassen soll. Also:

Java:
public Vector3 doSomething( int a ) {
  Vector3 v = new Vector3( a, a, a );
  // do something
  return v;
}

vs

Java:
public void doSomething( Vector3 v, int a ) {
  v.set( a, a, a );
  // do something
}

1) ist zweifellos die schoenere API, 2) ist gefuehlt schneller (wenn korrekt benutzt, werden u.U. DEUTLICH weniger Vector3 Objekte erzeugt, also hat der GC auch deutlich weniger zu tun.

Mein Weg ist bei solchen Fragen immer: Zuerst schoene API und sollten (per Profiler gemessene) Performanceprobleme genau dort auftreten (bzw. beim GC), die performantere Methode zusaetzlich rein, die auch von der schoenen benutzt wird.
 

Ullenboom

Bekanntes Mitglied
In der Java-API kann man ganz gut ablesen, was man macht: Kommt es auf Performance an, macht man die Objekte mutable, wie bei StringBuilder oder Vector (siehe etwa Java 3D API). Sonst immutable, wie BigInteger, String, ... Dass BigInteger immutable ist, ist dabei ein Performance-Problem und bei vielen Berechnungen sollte man sich eine mutable Implementierung suchen.
 

Marco13

Top Contributor
@schalentier: Das "schöner" ist so eine Sache - der angedeutete Code ist etwas zu suggestiv, um sich einen realen Anwendungsfall drunter vorzustellen, und im Zweifelsfall würde ich sagen, dass das komplett unterschiedliche Methoden sind.

Als Beispiel: Bei Java3D bzw. VecMath gibt es Klassen
Tuple3f
Point3f extends Tuple3f
Vector3f extends Tuple3f
Es gibt viele Methoden, für die Tuple3f reicht. Wenn man irgendwas zurückgeben muss, muss man sich für eine Implementierung entscheiden (und ggf. trotzdem Tuple3f zurückgeben). Wenn der Aufrufer aber gerade "das andere" braucht, ist das blöd.
Java:
void doSomethingA(Tuple3f t) { ... } // Modify parameter

Tuple3f doSomethingB() { ... } // Return new Tuple3f

void main()
{
    Vector3f v = new Vector3f();
    Point3f p = new Point3f();

    doSomethingA(v); // Works
    doSomethingA(p); // Works

    Tuple3f t = doSomethingB();
    // Sigh, I need a Point3f here...
    Point3f actualResult = new Point3f(t);
}
Deswegen muss man sich an manchen Stellen schon genau überlegen, was man tut. (Und wegen solcher Dinge finde ich, dass selbst vermeintlich triviale Dinge, wie "die Entwicklung allgemeiner 3D-Utility-Klassen" mit vielen sehr schweren und sehr wichtigen Designentscheidungen verbunden sind)

Ich finde das "Pattern", das z.B. bei BufferedImageOp (Java Platform SE 6) oder auch AffineTransform (Java Platform SE 6) verwendet wird, in solchen Fällen eine Erwägung wert: Man KANN das Objekt für die Ausgabe übergeben, aber wenn man 'null' übergibt, wird irgendein passendes Objekt allokiert.

So, wie die Fragestellung klang, könnte aber das dazu notwendige [c]if (param == null)[/c] zum Performance-Killer werden :joke:
 

schalentier

Gesperrter Benutzer
@Marco13: Ich stimm absolut zu.

Ich glaub, ich meinte auch eher eine Methode wie z.B. das Addieren von zwei Vector3. In diesem Fall ist klar, dass das Ergebnis auch ein Vector3 ist. Auch da stellt sich die Frage, ob es besser ist, fuer das Ergebnis eine neue Vector3-Instanz zu erzeugen, oder ob die "Ziel-" Instanz besser in die Methode reingegeben wird.

Beides ist imho valide und haengt stark vom konkreten Einsatzgebiet ab. Ersteres ist schoener im Sinne von OOP-Design. Zweiteres kann unter Umstaenden aber wirklich einen deutlichen Performanceboost bringen.

Schoen finde ich hier den Ansatz bei C# (glaub da hab ich das mal gesehen, oder wars C++11?), wo man vor einen Parameter noch "in" und "out" schreiben kann.
 

Evil-Devil

Top Contributor
Schoen finde ich hier den Ansatz bei C# (glaub da hab ich das mal gesehen, oder wars C++11?), wo man vor einen Parameter noch "in" und "out" schreiben kann.
In C# kannst das machen. Ist dann aber nicht mehr weit entfernt von den "bösen Pointern". Gerade bei besagter Vektoren Mechanik stellt man sich doch die Frage was weniger kostet. Ich mir jedenfalls immer und die Antwort der Antworten suche ich noch immer. Unabhängig davon das man heutzutage viele der Berechnungen direkt auf der GPU ausführen kann/sollte.
 

Marco13

Top Contributor
Hmja... auch ein etwas suggestives Beispiel, aber doch schon ganz gut, um das zu verdeutlichen. Wenn man eine Methode haben will, um zwei Vektoren zu addieren, könnte man machen
Java:
private static Vector3f add(Vector3f v0, Vector3f v1) 
{
    Vector3f result = new Vector3f();
    result.x = v0.x + v1.x;
    result.y = v0.y + v1.y;
    result.z = v0.z + v1.z;
    return result;
}
oder eben
Java:
private static void add(Vector3f v0, Vector3f v1, Vector3f result) 
{
    result.x = v0.x + v1.x;
    result.y = v0.y + v1.y;
    result.z = v0.z + v1.z;
}
Das "schöne" bei letzerem (insbesondere wenn es nicht um einen 3-Zeiler geht) ist, dass man dort statt Vector3f auch überall Tuple3f screiben kann, und es nach wie vor genauso (aber eben AUCH mit Point3f) funktioniert.

Diese Fragen wurden auch schonmal vor langer Zeit in einem anderen Thread so ähnlich diskutiert - dort ging es IIRC auch im vorgelagerte Fragen, auch im Zusammenhang mit der von Ullenboom angesprochenen Mutability - es gibt viele Optionen
Java:
class Vector3D
{
    public void add(Vector3D other) { /* this += other */ } // oder
    public Vector3D add(Vector3D other) { /* return this + other */ } // oder
    public static Vector3D add(Vector3D v0, Vector3D v1) { /* return v0+v1 */ } // oder
    public static void add(Vector3D v0, Vector3D v1, Vector3D sum) { /* sum = v0+v1 */ } // oder
    // oder was ganz anderes...?
}
und man könnte schon lange darüber streiten, welche davon aus Design-Sicht und abhängig von den gesetzen Prioritäten nun die "beste" ist - dazu kommt aber auch, dass sich die Gewichtung und Bedeutung vermeintlich objektiv bewertbarer Kriterien (wie ~"Performance durch wenige Objektallokationen") mit verschiedenen JVMs ändern kann.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
E Maximale KM-Kosten Java Basics - Anfänger-Themen 20
C Interface Parameter und Rückgabewerte in Lambda Ausdrücken verwenden Java Basics - Anfänger-Themen 16
C Parameter in verschiedenen Anzahl und Typen Java Basics - Anfänger-Themen 6
M methode aufrufen ohne parameter Java Basics - Anfänger-Themen 1
MiMa Java Doc mehrere Return Parameter Java Basics - Anfänger-Themen 11
BeginnerJava "Weihnachtsbäume" anzeigen: Höhe als Parameter Java Basics - Anfänger-Themen 1
R Methoden Werte einer ArrayList als Parameter übergeben. Java Basics - Anfänger-Themen 4
I Optionaler Parameter bei Methode, der nur optional ist? Java Basics - Anfänger-Themen 6
berserkerdq2 Zwei Klassen Erben von der Klasse A, die eine Klasse kann ich an Methoden übergeben, die als Parameter A haben, die andere nicht? Java Basics - Anfänger-Themen 3
Jambolo Methode, welche die 3 letzten Parameter Werte speichert Java Basics - Anfänger-Themen 20
L Beim Java Programmstart, mehrere Parameter über die Kommandozeile übergeben Java Basics - Anfänger-Themen 9
M Interface als Parameter einer Klasse Java Basics - Anfänger-Themen 8
R Eigenschaft über Parameter auslesen und ändern Java Basics - Anfänger-Themen 15
P Eclipse Karate Framework API Test . Unexpected Error: the trustAnchors parameter must be non-empty Java Basics - Anfänger-Themen 1
X Default Parameter Java Basics - Anfänger-Themen 20
J Interface methode aufrufen (interface parameter) Java Basics - Anfänger-Themen 7
KogoroMori21 Variable im Parameter und Ohne Java Basics - Anfänger-Themen 5
J Bestimmte parameter aus Jsonfile auslesen Java Basics - Anfänger-Themen 15
I JAX-RS Mehrere Parameter in Query Java Basics - Anfänger-Themen 3
H Warum kann man keine Parameter in die main-Methode packen? Java Basics - Anfänger-Themen 4
B Konstruktor mit Array als Parameter Java Basics - Anfänger-Themen 3
D Best Practice Parameter int vs byte Java Basics - Anfänger-Themen 16
L Methode implementieren, Parameter die übergeben werden sind final Java Basics - Anfänger-Themen 4
L Wie greife ich in der Subklasse auf die Parameter einer Methode der Superklasse zu ? Java Basics - Anfänger-Themen 15
C Methoden-Parameter ist Interface Java Basics - Anfänger-Themen 5
J Apache Poi - createCell() Methode akzeptiert keinen Index aus for-schleife als Parameter Java Basics - Anfänger-Themen 4
P Parameter auf Datenformat überprüfen Java Basics - Anfänger-Themen 5
S Hamster Simulator rechnen lernen Parameter int Java Basics - Anfänger-Themen 6
Curtis_MC Parameter-Übergabe bei Klassen und Methoden Java Basics - Anfänger-Themen 12
C Java Methoden "Parameter" Problem Java Basics - Anfänger-Themen 16
W Parameter solange addieren bis 13 auftaucht Java Basics - Anfänger-Themen 11
L OOP Parameter mit der Draw-Methode übergeben Java Basics - Anfänger-Themen 11
B Frage zu: String... strings -> Ungleiche Anzahl an Parameter? Java Basics - Anfänger-Themen 4
L Methoden Übergabe von Parameter Java Basics - Anfänger-Themen 3
R Zu viele leere Parameter Java Basics - Anfänger-Themen 8
H Frage zu Parameter einer Methode Java Basics - Anfänger-Themen 2
H Frage zu Parameter einer Methode Java Basics - Anfänger-Themen 3
B Klassen Array Parameter im Konstruktor? Java Basics - Anfänger-Themen 4
V Unbekannte Parameter Java Basics - Anfänger-Themen 1
J Input/Output Input als Parameter an Methoden übergeben Java Basics - Anfänger-Themen 23
B CSV einlesen - Parameter a) encoding b) delimiter Java Basics - Anfänger-Themen 7
U Mehrfacheingabe auf bestimmte Parameter prüfen Java Basics - Anfänger-Themen 8
A festgelegte Parameter Java Basics - Anfänger-Themen 11
PaperHat Methoden als Parameter anderer Methode verwenden Java Basics - Anfänger-Themen 11
D Interface Final für Parameter in überschriebenen Methoden? Java Basics - Anfänger-Themen 3
P Variablen Optionaler Parameter auf der Kommandozeile Java Basics - Anfänger-Themen 12
S Variable Parameter Java Basics - Anfänger-Themen 5
L Variablen Parameter bekommen Java Basics - Anfänger-Themen 13
M Methode mit Array als Parameter an Main übergeben Java Basics - Anfänger-Themen 1
A Aufruf von Konstruktor , obwohl 2 Parameter weggelassen werden Java Basics - Anfänger-Themen 7
A Aufruf von Konstruktor , obwohl 2 Parameter weggelassen werden Java Basics - Anfänger-Themen 0
B Webservice -> alle parameter bekommen von form Java Basics - Anfänger-Themen 2
K Klassenmethode mit übergebenen Parameter speichern Java Basics - Anfänger-Themen 7
I BigDecimal als Parameter verwenden Java Basics - Anfänger-Themen 3
J Parameter in main verwenden Java Basics - Anfänger-Themen 3
J Programm was üer Runtime.getRuntime gestartet wird erkennt String Parameter nicht Java Basics - Anfänger-Themen 0
G Int-Array im Konstruktor Parameter Java Basics - Anfänger-Themen 37
T Parameter das übergeben wurde ändern? Java Basics - Anfänger-Themen 1
D Anfänger-Fragen(Parameter einer Methode) Java Basics - Anfänger-Themen 7
P Operatoren Parameter nicht auf null geprüft? Java Basics - Anfänger-Themen 16
D Name eines JMenue als Parameter übergeben Java Basics - Anfänger-Themen 20
K Dynamischen Supplier für Parameter Java Basics - Anfänger-Themen 12
C Methoden Welche JSoup Methoden Und Parameter für diese HTML Tags Java Basics - Anfänger-Themen 4
A Die Werte zur Berechnung müssen als Parameter übergeben werden? Java Basics - Anfänger-Themen 7
H Klassen Konstruktor Parameter als Instanzvariablen zwischen speichern... Java Basics - Anfänger-Themen 11
W Methoden Methode ohne Parameter auf Instanz eines Objekts aufrufen? Java Basics - Anfänger-Themen 14
M Methode mit Parameter Java Basics - Anfänger-Themen 4
G Objektübergabe durch Parameter Java Basics - Anfänger-Themen 3
J Erste Schritte catch Exeption Parameter Java Basics - Anfänger-Themen 7
A Erste Schritte Methoden mit Parameter Java Basics - Anfänger-Themen 2
D Statische Objekte mit variablem Parameter Java Basics - Anfänger-Themen 1
N Klassen Klassen zwingende Parameter mitteilen Java Basics - Anfänger-Themen 4
L Methoden Methode Parameter vertauschen? Java Basics - Anfänger-Themen 3
C Auswertung Ausdruck mit Punknotation + Objekt als Parameter Java Basics - Anfänger-Themen 3
A Methoden Parameter optionalisieren möglich? - Wie? Java Basics - Anfänger-Themen 19
N Beliebig viele parameter Java Basics - Anfänger-Themen 3
F Methoden: Referenzvariable als Parameter Java Basics - Anfänger-Themen 4
J HttpGet Parameter mitgeben Java Basics - Anfänger-Themen 5
S Generische Methode soll Objekte als Parameter erlauben die bestimmtes Interface implementieren^ Java Basics - Anfänger-Themen 9
T Klasse von erfahren wenn Obertyp Parameter ist Java Basics - Anfänger-Themen 6
J Klassen Fehler mit Parameter des Konstruktors bei einer Objekterzeugung Java Basics - Anfänger-Themen 5
V Parameter in synchronized-Blöcken verstehen Java Basics - Anfänger-Themen 2
M Klasse als Parameter übergeben Java Basics - Anfänger-Themen 7
S Methoden eine Instanz einer eigenen Klasse als parameter übergeben Java Basics - Anfänger-Themen 9
T unterschiedlich viele parameter übergeben Java Basics - Anfänger-Themen 5
V Methoden key value Parameter Java Basics - Anfänger-Themen 11
J Drucker parameter ändern Java Basics - Anfänger-Themen 9
F trustAnchors parameter must be non-empty Java Basics - Anfänger-Themen 0
O Basisklassen als Methoden-Parameter ähnlich, wie in C++ ? Java Basics - Anfänger-Themen 6
D GregorianCalendar als Parameter Java Basics - Anfänger-Themen 2
M Parameter von Konstruktor, der Superklassen-Konstruktor aufruft Java Basics - Anfänger-Themen 2
E Problem beim Übergeben von Parameter an Methode Java Basics - Anfänger-Themen 2
O ArrayListe sortieren anhand zweier Parameter Java Basics - Anfänger-Themen 4
S Methoden Rückgabewert einer Methode als Parameter an eine andere Methode übergeben, geht das? Java Basics - Anfänger-Themen 5
D Enum als Parameter Java Basics - Anfänger-Themen 6
T In main-Methode Parameter übergeben Java Basics - Anfänger-Themen 3
M Methode als Parameter übergeben Java Basics - Anfänger-Themen 16
Joew0815 Methoden Objekt als Methoden-Parameter - Kein call-by-reference? Java Basics - Anfänger-Themen 12
T Parameter in Eigner Konsole Java Basics - Anfänger-Themen 2
ElfterDoktor Einen Objekt Attribute/Parameter geben & Auslesen Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben