Temporäre Heap-Objekte vermeiden?

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Alexander Kornrumpf
Moderator
Beiträge: 2114
Registriert: 25.02.2009, 13:37

Temporäre Heap-Objekte vermeiden?

Beitrag von Alexander Kornrumpf »

Hi!

Getriggert durch den OOP Thread und meine aktuellen Java Versuche mal eine Frage:

Folgendes Minimalbeispiel

c++

Code: Alles auswählen

//absichtlich kein const, hat java ja auch nicht.
void foo (Vector3f& vec)
{
 //...
}

int main()
{
    foo(Vector3f(1.0f, 1.0f, 1.0f));
}
versus java

Code: Alles auswählen

static void foo (Vector3f vec)
{
 //...
}

static void main()
{
    foo(new Vector3f(1.0f, 1.0f, 1.0f));
}
Was mich stört ist natürlich das zusätzliche "new" im java code. Gibt es eine Möglichkeit das wegzubekommen? Oder, was ich Java durchaus zutraue, wird das automatisch wegoptimiert? Das ist eine der Sachen die mich an Java so stören. Der Compiler/Optimizer benutzt zuviel Magie (siehe "überladener" + operator für strings und ähnliche Spielereien).
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4260
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: Temporäre Heap-Objekte vermeiden?

Beitrag von Chromanoid »

Wenn du häufiger einen bestimmten Hilfsvektor brauchst und das ganze nicht threadsafe sein muss, könntest du ne statische Variable draus machen... Aber an sich würde ich da auf den Compiler vertrauen. Um dem Compiler möglichst viel entgegen zu kommen ist afaik vor allem wichtig Methoden wenn möglich private, final oder static zu deklarieren.
Mit http://www.cs.ioc.ee/~ando/jbe/ kannst du dir ja mal den bytecode anschauen. Ansonsten wurde von dem Bullet Portierer eine JStackAlloc-Bibliothek erstellt (sollte auch noch etwas offiziellere Varianten geben). Die benutzt Object Pools um die Garbage Collection Zeiten bei einem extrem hohen Aufkommen an neuen Objekten zu verringern. Siehe http://www.javagaming.org/index.php/topic,18843.0.html Ob das wirklich langfristig sinnvoll ist, wage ich zu bezweifeln.
Ich würde mir bei Java erst Gedanken um Optimierung machen, wenn tatsächlich Probleme auftreten sollten. Mit einem Profiler kann man dann schnell erkennen, wo die wirklichen bottlenecks liegen.
Alexander Kornrumpf
Moderator
Beiträge: 2114
Registriert: 25.02.2009, 13:37

Re: Temporäre Heap-Objekte vermeiden?

Beitrag von Alexander Kornrumpf »

Ja, auf Anraten der jMonkeyEngine Doku hantiere ich schon mit Quaternionen, die rot90X o.ä. heißen.

Kommt mir dennoch seltsam vor dieses Objekt-Recycling.
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4260
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: Temporäre Heap-Objekte vermeiden?

Beitrag von Chromanoid »

Wenn du tunen willst kannst du sonst auch hier mal reinschauen: http://www.oracle.com/technetwork/java/ ... 40523.html
Bilder scheinen irgendwie kaputt zu sein...

Objektwiederverwendung zur Optimierung gibt es eigentlich in recht vielen Sprachen. Schließlich hat man nicht überall die Möglichkeit den Stack für Objekte direkt zu benutzen. Weiß jemand wie das bei C# aussieht, dort kann man doch genauso wie in Java Objekte nur im Heap ablegen oder?
Despotist
Establishment
Beiträge: 394
Registriert: 19.02.2008, 16:33

Re: Temporäre Heap-Objekte vermeiden?

Beitrag von Despotist »

Chromanoid hat geschrieben: Weiß jemand wie das bei C# aussieht, dort kann man doch genauso wie in Java Objekte nur im Heap ablegen oder?
Nein. Wenn du ein Objekt mit "class" deklarierst kommt es auf den Heap (new erforderlich). Wenn du es als "struct" declarierst kommt es auf den Stack. Das wird zb für die Basistypen (int) und gern auch Vectoren usw benutzt.

Zwei Links einer kurzen Google-Suche die die Sachen vielleicht besser erläutern:
http://discuss.techinterview.org/defaul ... .489354.15
http://www.jaggersoft.com/pubs/StructsVsClasses.htm
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4260
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: Temporäre Heap-Objekte vermeiden?

Beitrag von Chromanoid »

Ah sehr interessant - vielen Dank. Mal wieder ein Pluspunkt für C# :)
Antworten