One of the commonly admitted facts I knew for a long time was that reflection in Java is slow. I believed the fact in general, but when writing my own class that needed generic construction of an object I decided to test the legend. My hope was that for a task as simple as using of default constructor call to
new
cannot be much better than call to class.newInstance()
. Here is my test program (I took some precautions to avoid optimizing out creation of the objects from the loop):import java.util.GregorianCalendar;
public class Console {
static class Foo {
long l;
double d;
String s = "foo";
Foo() {
l = new GregorianCalendar().getTimeInMillis();
d = (double)(l * l);
}
}
public static void main(String[] args) {
try {
long l1 = new GregorianCalendar().getTimeInMillis();
double sum = 0;
Class<Foo> clazz = Foo.class;
for(int i = 0; i < 1000000; ++i) {
Foo foo = (Foo) clazz.newInstance();
sum += foo.d;
foo = null;
}
long l2 = new GregorianCalendar().getTimeInMillis();
System.out.println("" + sum + ": " + (l2-l1));
sum = 0;
for(int i = 0; i < 1000000; ++i) {
Foo foo = new Foo();
sum += foo.d;
foo = null;
}
l1 = new GregorianCalendar().getTimeInMillis();
System.out.println("" + sum + ": " + (l1-l2));
} catch (Throwable e) {}
}
}
Here is the result: I was wrong. Creation of 1,000,000 objects on my computer took ~1,700 millis with the call to
class.newInstance()
and ~1,050 millis with the call to new
. Conclusion: some legends can be trusted. But you never know which.
No comments:
Post a Comment