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