zoukankan      html  css  js  c++  java
  • Java 反射与cglib.proxy与cglib.beanmap与直接赋值 性能对比


    测试代码:

    代码
    import java.lang.reflect.Method;
    import java.util.Calendar;
    import java.util.Date;

    import net.sf.cglib.beans.BeanMap;
    import net.sf.cglib.proxy.Enhancer;
    import net.sf.cglib.proxy.MethodInterceptor;
    import net.sf.cglib.proxy.MethodProxy;

    public class TestPerformance
    {
        
    public static void main(String[] args)
        {
            
    int times = 10000000;
            
    // TestBean(times);//=15
            
    // TestCglib(times);//=516
            
    // TestBeanMap(times);//=256
            TestReflection(times);// =11359
        }

        
    public static void TestBean(int times)
        {
            MyBean bean 
    = new MyBean();

            Date start 
    = Calendar.getInstance().getTime();
            
    for (int i = 0; i < times; i++)
            {
                bean.setName(
    "helloworld");
                Object v 
    = bean.getName();
            }

            Date end 
    = Calendar.getInstance().getTime();

            System.out.println(end.getTime() 
    - start.getTime());
        }

        
    public static void TestCglib(int times)
        {
            Enhancer enhancer 
    = new Enhancer();
            enhancer.setSuperclass(MyBean.
    class);
            enhancer.setCallback(
    new TestMethodInterceptorImpl());
            MyBean my 
    = (MyBean) enhancer.create();

            Date start 
    = Calendar.getInstance().getTime();
            
    for (int i = 0; i < times; i++)
            {
                my.setName(
    "helloworld");
                Object v 
    = my.getName();
            }

            Date end 
    = Calendar.getInstance().getTime();

            System.out.println(end.getTime() 
    - start.getTime());
        }

        
    public static void TestBeanMap(int times)
        {
            MyBean bean 
    = new MyBean();
            BeanMap map 
    = BeanMap.create(bean);

            Date start 
    = Calendar.getInstance().getTime();
            
    for (int i = 0; i < times; i++)
            {
                map.put(bean, 
    "name""helloworld");
                Object v 
    = bean.getName();
            }
            Date end 
    = Calendar.getInstance().getTime();

            System.out.println(end.getTime() 
    - start.getTime());
        }

        
    public static void TestReflection(int times)
        {
            MyBean bean 
    = new MyBean();
            Class c 
    = MyBean.class;
            
    try
            {
                Method get 
    = c.getDeclaredMethod("getName"null);
                Method set 
    = c.getDeclaredMethod("setName", String.class);
                Date start 
    = Calendar.getInstance().getTime();
                
    for (int i = 0; i < times; i++)
                {
                    set.invoke(bean, 
    "helloworld");
                    Object v 
    = get.invoke(bean, null);
                }
                Date end 
    = Calendar.getInstance().getTime();

                System.out.println(end.getTime() 
    - start.getTime());
            } 
    catch (Exception ex)
            {

            }
        }
    }

    class TestMethodInterceptorImpl implements MethodInterceptor
    {
        
    public Object intercept(Object obj, Method method, Object[] args,
                MethodProxy proxy) 
    throws Throwable
        {
            
    return proxy.invokeSuper(obj, args);
        }
    }

    class MyBean
    {
        
    private String name;

        
    public String getName()
        {
            
    return name;
        }

        
    public void setName(String name)
        {
            
    this.name = name;
        }
    }

    测试结果:

    直接赋值 = 15

    cglib.proxy = 516

    cglib.beanmap = 256

    reflection = 11359

  • 相关阅读:
    ES自身支持容灾异地容灾么?生产环境如何实施?
    Redis集群详解
    原生js实现jquery的ajax
    用原生js实现jquery的一些方法
    原生javascript的一些常用方法
    原生javascript
    理解和熟练运用call和apply
    做项目过程中的css reset
    深入理解javascript编程中的同步和异步
    history.back(-1)和history.go(-1)的区别
  • 原文地址:https://www.cnblogs.com/zc22/p/1761332.html
Copyright © 2011-2022 走看看