Java Reflection Performance

前端 未结 14 1628
感动是毒
感动是毒 2020-11-22 08:25

Does creating an object using reflection rather than calling the class constructor result in any significant performance differences?

14条回答
  •  灰色年华
    2020-11-22 09:02

    I think it depends on how light/heavy the target method is. if the target method is very light(e.g. getter/setter), It could be 1 ~ 3 times slower. if the target method takes about 1 millisecond or above, then the performance will be very close. here is the test I did with Java 8 and reflectasm :

    public class ReflectionTest extends TestCase {    
        @Test
        public void test_perf() {
            Profiler.run(3, 100000, 3, "m_01 by refelct", () -> Reflection.on(X.class)._new().invoke("m_01")).printResult();    
            Profiler.run(3, 100000, 3, "m_01 direct call", () -> new X().m_01()).printResult();    
            Profiler.run(3, 100000, 3, "m_02 by refelct", () -> Reflection.on(X.class)._new().invoke("m_02")).printResult();    
            Profiler.run(3, 100000, 3, "m_02 direct call", () -> new X().m_02()).printResult();    
            Profiler.run(3, 100000, 3, "m_11 by refelct", () -> Reflection.on(X.class)._new().invoke("m_11")).printResult();    
            Profiler.run(3, 100000, 3, "m_11 direct call", () -> X.m_11()).printResult();    
            Profiler.run(3, 100000, 3, "m_12 by refelct", () -> Reflection.on(X.class)._new().invoke("m_12")).printResult();    
            Profiler.run(3, 100000, 3, "m_12 direct call", () -> X.m_12()).printResult();
        }
    
        public static class X {
            public long m_01() {
                return m_11();
            }    
            public long m_02() {
                return m_12();
            }    
            public static long m_11() {
                long sum = IntStream.range(0, 10).sum();
                assertEquals(45, sum);
                return sum;
            }    
            public static long m_12() {
                long sum = IntStream.range(0, 10000).sum();
                assertEquals(49995000, sum);
                return sum;
            }
        }
    }
    

    The complete test code is available at GitHub:ReflectionTest.java

提交回复
热议问题