newInstance() vs new

11,568

Solution 1

In a real world test, creating 18129 instances of a class via "Constuctor.newInstance" passing in 10 arguments -vs- creating the instances via "new" the program took no measurable difference in time.

This wasn't any sort of micro benchmark.

This is with JDK 1.6.0_12 on Windows 7 x86 beta.

Given that Constructor.newInstance is going to be very simlilar to Class.forName.newInstance I would say that the overhead is hardly anything given the functionality that you can get using newInstance over new.

As always you should test it yourself to see.

Solution 2

Be wary of microbenchmarks, but I found this blog entry where someone found that new was about twice as fast as newInstance with JDK 1.4. It sounds like there is a difference, and as expected, reflection is slower. However, it sounds like the difference may not be a dealbreaker, depending on the frequency of new object instances vs how much computation is being done.

Share:
11,568

Related videos on Youtube

javito
Author by

javito

Updated on August 31, 2020

Comments

  • javito
    javito over 3 years

    Is there a penalty for calling newInstance() or is it the same mechanism underneath? How much overhead if any does newInstance() have over the new keyword* ?

    *: Discounting the fact that newInstance() implies using reflection.

  • TofuBeer
    TofuBeer about 15 years
    Reflection has gooten faster with each release of Java.
  • Eddie
    Eddie about 15 years
    Yes, indeed, which is why I mentioned use of 1.4 in the benchmark I found. I'm sure that newInstance is still slower, but I'd be surprised if it were a huge difference.
  • Brett
    Brett about 15 years
    Calling setAccessible(true) on the Constructor should make it slightly faster (but make sure still secure). Of course, I'd suggest avoiding reflection if possible in any case.
  • Eddie
    Eddie about 15 years
    Check out ibm.com/developerworks/java/library/j-jtp02225.html ... these sorts of benchmarks are very difficult to get right due to the dynamic way that code is compiled/optimized by the JVM.
  • cmdematos
    cmdematos over 10 years
    I would take a careful look at this code. During runtime, the java optimizer will simply stop executing new String() because it can tell doing so will have no side effects. It will not do the same for String.class.newInstance() because it is reflection and it cannot tell whether the newInstance factory class has side effects.