D
Datenklaun
Gast
Hallo
Bei der Entwicklung von einer Art Interpreter bin ich immer wieder auf die Performance-Schwachstelle von Reflection aufmerksam geworden, weshalb ich mich schon mit Alternativen à la Javassist und so weiter beschäftigt habe, ohne je einen Test gemacht zu haben.
Das wurde heute nachgeholt und führte bei einem Test von Instanzierung und Methodenaufruf zu einem für mich unglaubwürdigen Ergebnis. Daher stellt sich mir die Frage ob in meiner Testmethode ein grober Fehler steckt, den ich übersehe.
Oder kann es sein, daß das Instanzieren von Objekten und das Aufrufen von Methoden per Reflection in Java 7 schon extrem schnell ist? Wenn ja, wie ist es bei älteren JRE's?
In der Methode wird zuerst ein Frame-Object instanziert, die Methoden setTitle, show, und dispose aufgerufen und anschließend das Frame-Object wieder gelöscht. Dieser Ablauf wird durch eine for-Anweisung mehrmals wiederholt, um ein stabileres Ergebnis zu bekommen.
Der selbe Ablauf wird dann mittels Reflection nachgebildet, was jedoch zusätzlich noch das Ermitteln des Class-Objekts und Method-Objekts erfordert.
Umgesetzt habe ich das ganze so:
Auf meinem Windos-System ergab die Zeitmessung für die natürliche Instanzierung ca. 4 mia ns und bei der reflektiven 4.5.
Wenn ihr einen markanten Fehler findet, der den Test verfälscht, freue ich mich; wenn der Test stimmt dann kann ich jubilieren und mir (vorerst) den Umweg über Bytecode-Verarbeitung sparen.
Viele Grüße, DerKlaun
Bei der Entwicklung von einer Art Interpreter bin ich immer wieder auf die Performance-Schwachstelle von Reflection aufmerksam geworden, weshalb ich mich schon mit Alternativen à la Javassist und so weiter beschäftigt habe, ohne je einen Test gemacht zu haben.
Das wurde heute nachgeholt und führte bei einem Test von Instanzierung und Methodenaufruf zu einem für mich unglaubwürdigen Ergebnis. Daher stellt sich mir die Frage ob in meiner Testmethode ein grober Fehler steckt, den ich übersehe.
Oder kann es sein, daß das Instanzieren von Objekten und das Aufrufen von Methoden per Reflection in Java 7 schon extrem schnell ist? Wenn ja, wie ist es bei älteren JRE's?
In der Methode wird zuerst ein Frame-Object instanziert, die Methoden setTitle, show, und dispose aufgerufen und anschließend das Frame-Object wieder gelöscht. Dieser Ablauf wird durch eine for-Anweisung mehrmals wiederholt, um ein stabileres Ergebnis zu bekommen.
Der selbe Ablauf wird dann mittels Reflection nachgebildet, was jedoch zusätzlich noch das Ermitteln des Class-Objekts und Method-Objekts erfordert.
Umgesetzt habe ich das ganze so:
Java:
public Object[] test()
{
Object[] ret=new Object[2];
long time=System.nanoTime();
for (int i=0;i<44;i++){
Frame testObj= new Frame();
testObj.setTitle("Frame 1");
testObj.show();
testObj.dispose();
testObj=null;
}
ret[0]=new Long(System.nanoTime()-time);
time=System.nanoTime();
for (int i=0;i<44;i++){
try{
Class testClass=Class.forName("java.awt.Frame");
Object testObj=testClass.newInstance();
testClass.getMethod("setTitle",new Class[]{(new String()).getClass()}).invoke(testObj,new Object[]{new String("Frame 1")});
testClass.getMethod("show",new Class[]{}).invoke(testObj,new Object[]{});
testClass.getMethod("dispose",new Class[]{}).invoke(testObj,new Object[]{});
testClass=null;
testObj=null;
}
catch (Exception e){
}
}
ret[1]=new Long(System.nanoTime()-time);
return ret;
}
Auf meinem Windos-System ergab die Zeitmessung für die natürliche Instanzierung ca. 4 mia ns und bei der reflektiven 4.5.
Wenn ihr einen markanten Fehler findet, der den Test verfälscht, freue ich mich; wenn der Test stimmt dann kann ich jubilieren und mir (vorerst) den Umweg über Bytecode-Verarbeitung sparen.
Viele Grüße, DerKlaun