# "Object o = new Object()" vs. "new Object()&q



## tuxedo (29. Feb 2008)

Habe ne kleine Performance-Frage:

Mir gehts um die kleinste Millisekunde (bzgl. meines SIMON Projekts).

Ich habe an vielen Stellen in Schleifen sowas hier (nur exemplarisch):


```
Object o = new Object(abc);
objectX.methodX(arg1, arg2, o);
```

"o" verwende ich eigentlich nur in "methodX", später nicht mehr. 
Aus "lesbarkeitsgründen" hab ich sowas hier nicht gemacht:


```
objectX.methodX(arg1, arg2, new Object(abc));
```

Mir ist klar, dass ich so oder so "new" machen muss und damit Speicher für das Objekt allokiert wird. Aber was mir noch nicht ganz klar ist, ob es "sparender" ist das Objekt wie im zweiten Code-Schnipsel zu verwenden. 

MIr gehts hier wirklich um jede noch so kleine Zeitersparnis. Muss vielleicht dazusagen:

Mein Projekt SIMON kann im lokalen Netz eine Methode auf der Remote-Seite binnen 0.5ms ausführen. Ziel ist es aber das ganze auf 0.15ms zu reduzieren (RMI ist so schnell...). Von daher geht's wirklich um jedes Quäntchen Geschwindigkeit. Werde sicher noch 1000 andere Ecken  haben an denen ich was verbessern kann. Aber irgendwo muss ich eben anfangen.

- Alex


----------



## tfa (29. Feb 2008)

Ich hab mal folgendes ausprobiert:

```
public void m(Integer i) {
        System.out.println(i);
    }

    public void x1() {
        Integer i = new Integer(1);
        m(i);
    }

    public void x2() {
        m(new Integer(1));
    }
```

Der Bytecode, den javac daraus macht, sieht so aus:


> // Method descriptor #26 ()V
> // Stack: 3, Locals: 2
> public void x1();
> 0  new java.lang.Integer [20]
> ...


_

Das wird also vom Compiler (Java 1.5) nicht optimiert, in der zweiten Version könnte es
also minimalst schneller sein. Was der JIT daraus macht, weiß ich nicht. Das müsste man testen._


----------



## tuxedo (29. Feb 2008)

Habs mal eingebaut. Hab mit meinem Profiler aber mal weiter gespielt und festgestellt, dass die Hauptzeit für das senden der Daten drauf geht:



> Count     Time    Pct  Location
> =====     ====    ===  ========
> 1  31405,9  100,0  de.root1.simon.Registry:run
> 1  28794,0   99,9  de.root1.simon.Endpoint:run
> ...



Getestet hab ich ein Benchmark das unterschiedliche Datenmengen transferiert. Deshalb die 17.000 Aufrufe. SendData sieht wie folgt aus:


```
private void sendData(Object result, ObjectOutputStream oos)
			throws IOException {
		oos.write(Statics.INVOCATION_RETURN_PACKET);
		oos.writeInt(requestId);
		oos.writeObject(result);
		oos.flush();
	}
```

Denke der ObjectOutputStream ist nicht der schnellste, bzw. das senden von ganzen Objekten ist nicht so prickelnd. Werde mir da mal was anderes einfallen lassen müssen.

- Alex


----------



## Angel4585 (1. Mrz 2008)

Also bei SocketChannel mit nem ByteArrayOutputStream in diesen pack ich über deinen oos das Objekt, gibt mir ein ByteBuffer aus, kann davor direkt das Int hängen für die Länge und dann alles in einem verschicken


----------



## lotus (1. Mrz 2008)

Wenn man eine Variable wirklich nur einmal verwendet und nicht ändert,kann man soweit ich weiß "final" verwenden.
Also:


```
bla(new Object(abc));
```

ist das selbe wie


```
final Object o = new Object(abc);
bla(o);
```

Ist halt nur besser lesbar. :wink: 

Würde das auch gerne mal genauer wissen...Wie kann man denn den Bytecode anzeigen lassen?  ???:L


----------



## Murray (1. Mrz 2008)

lotus hat gesagt.:
			
		

> Wie kann man denn den Bytecode anzeigen lassen?  ???:L


Beim JDK ist javap.exe dabei, damit geht das:
javap -c <Name der Klasse>


----------



## tuxedo (3. Mrz 2008)

Also ich hab jetzt wo's ging "final" eingesetzt. Gebracht hats aber nix. 

Muss irgendwo noch ein Speicherleck haben. Mal schauen wie ich das mit dem Profiler rausbekomme.

- Alex


----------



## sliwalker (3. Mrz 2008)

Hoi,

zu den Performances der Streams kann ich nicht viel sagen, aber das mit dem anonymen Objekt dürfte Dir dahingehend Zeit "sparen", als das keine Variable im Tabel angelegt wird und folglich auch nicht darauf zugegriffen werden muss, was Dir zumindest die Reaktionszeit des RAMs spart. 

greetz
SLi


----------



## Guest (4. Mrz 2008)

Weiß jemand, ob es für NetBeans ein Plugin für javap gibt oder ob das vielleicht standardmäßig integriert ist?


----------

