Ich habe andere Themen gesehen, die sagen, Java-Reflektionsleistung ist 10-100x langsamer als bei Verwendung von Nichtreflexionsaufrufen.Interpretieren Java Reflektionsleistung: Warum ist es überraschend schnell?
Meine Tests in 1.6 haben gezeigt, dass dies nicht der Fall ist, aber ich fand einige andere interessante Dinge, die ich jemanden brauche, um mir zu erklären.
Ich habe Objekte, die meine Schnittstelle implementieren. Ich habe drei Dinge gemacht 1) mit einem Verweis auf ein Objekt Ich werfe dieses Objekt auf die Schnittstelle und rufen Sie die Methode über die Schnittstelle 2) mit einem Verweis auf das eigentliche Objekt rufen Sie die Methode direkt und 3) rufen Sie die Methode durch Reflexion. Ich sah, dass # 1 Interface Call am schnellsten war, dicht gefolgt von # 3 Reflection, aber ich bemerkte, dass der direkte Methodenaufruf mit Abstand die langsamste war.
Ich verstehe das nicht, ich hätte erwartet, dass der direkte Anruf am schnellsten sein würde, dann die Schnittstelle, dann würde Reflexion viel viel langsamer sein.
Blah und ComplexClass sind in einem anderen Paket als die Hauptklasse und beide haben eine doSomething (int x) -Methode, die die Schnittstelle implementiert und nur die Ganzzahl x ausgibt.
Hier meine Ergebnisse sind (Zeiten in ms ergibt sich sehr ähnlich w/mehrere Studien): direkt Aufruf einer Methode: 107194 ein Verfahren direkt von einem Objekt gecastet in einem Interface Aufruf: 89.594 eine Methode durch Reflexion Aufruf: 90453
Hier ist mein Code:
public class Main
{
/**
* @param args the command line arguments
*/
public static void main(String[] args)
{
Blah x = new Blah();
ComplexClass cc = new ComplexClass();
test((Object) x, cc);
}
public static void test(Object x, ComplexClass cc)
{
long start, end;
long time1, time2, time3 = 0;
int numToDo = 1000000;
MyInterface interfaceClass = (MyInterface) x;
//warming up the cache
for (int i = 0; i < numToDo; i++)
{
cc.doSomething(i); //calls a method directly
}
start = System.currentTimeMillis();
for (int i = 0; i < numToDo; i++)
{
cc.doSomething(i); //calls a method directly
}
end = System.currentTimeMillis();
time1 = end - start;
start = System.currentTimeMillis();
for (int i = 0; i < numToDo; i++)
{
interfaceClass.doSomething(i); //casts an object to an interface then calls the method
}
end = System.currentTimeMillis();
time2 = end - start;
try
{
Class xClass = x.getClass();
Class[] argTypes =
{
int.class
};
Method m = xClass.getMethod("doSomething", argTypes);
Object[] paramList = new Object[1];
start = System.currentTimeMillis();
for (int i = 0; i < numToDo; i++)
{
paramList[0] = i;
m.invoke(x, paramList); //calls via reflection
}
end = System.currentTimeMillis();
time3 = end - start;
} catch (Exception ex)
{
}
System.out.println("calling a method directly: " + time1);
System.out.println("calling a method directly from an object cast to an interface: " + time2);
System.out.println("calling a method through reflection: " + time3);
}
WARUM CW? es ist eine gültige nicht subjektive Programmierung bezogene Frage? Und warum die Stimmen zu schließen ?! – hhafez
Ich habe den Titel zu einer Frage für diejenigen gemacht, die eine Frage nicht sehen können, es sei denn, sie hat das Zeichen. Aber Community Wiki? –