Package org.apache.geronimo.gbean

Source Code of org.apache.geronimo.gbean.Speed$MyInterface

/**
*
* Copyright 2004 The Apache Software Foundation
*
*  Licensed under the Apache License, Version 2.0 (the "License");
*  you may not use this file except in compliance with the License.
*  You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
*  Unless required by applicable law or agreed to in writing, software
*  distributed under the License is distributed on an "AS IS" BASIS,
*  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*  See the License for the specific language governing permissions and
*  limitations under the License.
*/
package org.apache.geronimo.gbean;

/**
* @version $Rev: 46019 $ $Date: 2004-09-14 04:56:06 -0500 (Tue, 14 Sep 2004) $
*/
import java.lang.reflect.Method;

import javax.management.ObjectName;

import net.sf.cglib.reflect.FastClass;
import net.sf.cglib.proxy.MethodProxy;
import org.apache.geronimo.gbean.jmx.CGLibProxyFactory;
import org.apache.geronimo.gbean.jmx.ProxyFactory;
import org.apache.geronimo.gbean.jmx.ProxyMethodInterceptor;
import org.apache.geronimo.gbean.jmx.VMProxyFactory;
import org.apache.geronimo.gbean.jmx.GBeanMBean;
import org.apache.geronimo.gbean.jmx.CGLibMethodInterceptor;
import org.apache.geronimo.gbean.jmx.RawInvoker;
import org.apache.geronimo.kernel.MockGBean;
import org.apache.geronimo.kernel.Kernel;

/**
* @version $Rev: 46019 $ $Date: 2004-09-14 04:56:06 -0500 (Tue, 14 Sep 2004) $
*/
public class Speed {
    private static final Object[] NO_ARGS = new Object[0];

    public static void main(String[] ignored) throws Exception {
        System.out.println("Do Nothing Timings");
        System.out.println("------------------");
        doNothingTimings();
        System.out.println();
        System.out.println();
        System.out.println();
        doNothingTimings();
//        System.out.println("Echo Timings");
//        System.out.println("-------------");
//        echoTimings();
    }

    private static void doNothingTimings() throws Exception {
        Method myMethod = MockGBean.class.getMethod("doNothing", null);

        FastClass myFastClass = FastClass.create(MockGBean.class);
        int myMethodIndex = myFastClass.getIndex("doNothing", new Class[0]);

        MockGBean instance = new MockGBean("foo", 12);

        // normal invoke
        int iterations = 100000000;
        String msg = "hhhh";
        for (int j=0 ; j < 10; j++) {
            for (int i = 0; i < iterations; i++) {
                msg= instance.echo(msg);
            }
        }
        long start = System.currentTimeMillis();
        for (int i = 0; i < iterations; i++) {
            instance.doNothing();
        }
        long end = System.currentTimeMillis();
        printResults("Normal", end, start, iterations);

        // reflection
        iterations = 1000000;
        for (int i = 0; i < iterations; i++) {
            myMethod.invoke(instance, null);
        }
        start = System.currentTimeMillis();
        for (int i = 0; i < iterations; i++) {
            myMethod.invoke(instance, null);
        }
        end = System.currentTimeMillis();
        printResults("Reflection", end, start, iterations);

        // fast class
        iterations = 5000000;
        for (int i = 0; i < iterations; i++) {
            myFastClass.invoke(myMethodIndex, instance, null);
        }
        start = System.currentTimeMillis();
        for (int i = 0; i < iterations; i++) {
            myFastClass.invoke(myMethodIndex, instance, null);
        }
        end = System.currentTimeMillis();
        printResults("FastClass", end, start, iterations);

        // start a kernel
        Kernel kernel = new Kernel();
        kernel.boot();
        GBeanMBean mockGBean = new GBeanMBean(MockGBean.getGBeanInfo(), Speed.class.getClassLoader());
        mockGBean.setAttribute("Name", "bar");
        mockGBean.setAttribute("FinalInt", new Integer(57));
        ObjectName objectName = new ObjectName("speed:type=MockGBean");
        kernel.loadGBean(objectName, mockGBean);
        kernel.startGBean(objectName);

        // reflect proxy
        ProxyFactory vmProxyFactory = new VMProxyFactory(MyInterface.class);
        ProxyMethodInterceptor vmMethodInterceptor = vmProxyFactory.getMethodInterceptor();
        MyInterface vmProxy = (MyInterface) vmProxyFactory.create(vmMethodInterceptor);
        vmMethodInterceptor.connect(kernel.getMBeanServer(), objectName);
        iterations = 50000;
        for (int i = 0; i < iterations; i++) {
            vmProxy.doNothing();
        }
        start = System.currentTimeMillis();
        for (int i = 0; i < iterations; i++) {
            vmProxy.doNothing();
        }
        end = System.currentTimeMillis();
        printResults("ReflectionProxy", end, start, iterations);

        // cglib proxy (front half)
/*
        ProxyFactory frontCGLibProxyFactory = new CGLibProxyFactory(MyInterface.class);
        ProxyMethodInterceptor frontCGLibMethodInterceptor = new CGLibMethodInterceptor(MyInterface.class);
        Class enhancedType = frontCGLibProxyFactory.create(frontCGLibMethodInterceptor).getClass();
        frontCGLibMethodInterceptor = new CGLibMethodInterceptor(enhancedType) {
            public Object intercept(Object object, Method method, Object[] args, MethodProxy proxy) throws Throwable {
                return null;
            }
        };
        MyInterface frontCGLibProxy = (MyInterface) frontCGLibProxyFactory.create(frontCGLibMethodInterceptor);
        frontCGLibMethodInterceptor.connect(kernel.getMBeanServer(), objectName);
        iterations = 100000000;
        for (int i = 0; i < iterations; i++) {
            frontCGLibProxy.doNothing();
        }
        start = System.currentTimeMillis();
        for (int i = 0; i < iterations; i++) {
            frontCGLibProxy.doNothing();
        }
        end = System.currentTimeMillis();
        printResults("Front CGLibProxy", end, start, iterations);
*/

        // Raw Invoker
        RawInvoker rawInvoker = (RawInvoker) kernel.getAttribute(objectName, "$$RAW_INVOKER$$");
        int rawIndex = ((Integer) rawInvoker.getOperationIndex().get(new GOperationSignature("doNothing", new String[0]))).intValue();
        iterations = 2000000;
        for (int i = 0; i < iterations; i++) {
            rawInvoker.invoke(rawIndex, NO_ARGS);
        }
        start = System.currentTimeMillis();
        for (int i = 0; i < iterations; i++) {
            rawInvoker.invoke(rawIndex, NO_ARGS);
        }
        end = System.currentTimeMillis();
        printResults("Raw Invoker", end, start, iterations);

        // cglib proxy
        ProxyFactory cgLibProxyFactory = new CGLibProxyFactory(MyInterface.class);
        ProxyMethodInterceptor cgLibMethodInterceptor = cgLibProxyFactory.getMethodInterceptor();
        MyInterface cgLibProxy = (MyInterface) cgLibProxyFactory.create(cgLibMethodInterceptor);
        cgLibMethodInterceptor.connect(kernel.getMBeanServer(), objectName);
        iterations = 1000000;
        for (int i = 0; i < iterations; i++) {
            cgLibProxy.doNothing();
        }
        start = System.currentTimeMillis();
        for (int i = 0; i < iterations; i++) {
            cgLibProxy.doNothing();
        }
        end = System.currentTimeMillis();
        printResults("CGLibProxy", end, start, iterations);
    }


    private static void echoTimings() throws Exception {
        Method myMethod = MockGBean.class.getMethod("echo", new Class[]{String.class});

        FastClass myFastClass = FastClass.create(MockGBean.class);
        int myMethodIndex = myFastClass.getIndex("echo", new Class[]{String.class});
        String msg = "Some message";
        Object[] args = new Object[]{msg};
        String result;

        MockGBean instance = new MockGBean("foo", 12);


        // normal invoke
        int iterations = 100000000;
        for (int i = 0; i < iterations; i++) {
            result = instance.echo(msg);
        }
        long start = System.currentTimeMillis();
        for (int i = 0; i < iterations; i++) {
            result = instance.echo(msg);
        }
        long end = System.currentTimeMillis();
        printResults("Normal", end, start, iterations);

        // reflection
        iterations = 10000000;
        for (int i = 0; i < iterations; i++) {
            result = (String) myMethod.invoke(instance, args);
        }
        start = System.currentTimeMillis();
        for (int i = 0; i < iterations; i++) {
            result = (String) myMethod.invoke(instance, args);
        }
        end = System.currentTimeMillis();
        printResults("Reflection", end, start, iterations);

        // fast class
        iterations = 10000000;
        for (int i = 0; i < iterations; i++) {
            result = (String) myFastClass.invoke(myMethodIndex, instance, args);
        }
        start = System.currentTimeMillis();
        for (int i = 0; i < iterations; i++) {
            result = (String) myFastClass.invoke(myMethodIndex, instance, args);
        }
        end = System.currentTimeMillis();
        printResults("FastClass", end, start, iterations);

        // start a kernel
        Kernel kernel = new Kernel();
        kernel.boot();
        GBeanMBean mockGBean = new GBeanMBean(MockGBean.getGBeanInfo(), Speed.class.getClassLoader());
        mockGBean.setAttribute("Name", "bar");
        mockGBean.setAttribute("FinalInt", new Integer(57));
        ObjectName objectName = new ObjectName("speed:type=MockGBean");
        kernel.loadGBean(objectName, mockGBean);
        kernel.startGBean(objectName);

        // reflect proxy
        ProxyFactory vmProxyFactory = new VMProxyFactory(MyInterface.class);
        ProxyMethodInterceptor vmMethodInterceptor = vmProxyFactory.getMethodInterceptor();
        MyInterface vmProxy = (MyInterface) vmProxyFactory.create(vmMethodInterceptor);
        vmMethodInterceptor.connect(kernel.getMBeanServer(), objectName);
        iterations = 50000;
        for (int i = 0; i < iterations; i++) {
            result = vmProxy.echo(msg);
        }
        start = System.currentTimeMillis();
        for (int i = 0; i < iterations; i++) {
            result = vmProxy.echo(msg);
        }
        end = System.currentTimeMillis();
        printResults("ReflectionProxy", end, start, iterations);

        // cglib proxy
        ProxyFactory cgLibProxyFactory = new CGLibProxyFactory(MyInterface.class);
        ProxyMethodInterceptor cgLibMethodInterceptor = cgLibProxyFactory.getMethodInterceptor();
        MyInterface cgLibProxy = (MyInterface) cgLibProxyFactory.create(cgLibMethodInterceptor);
        cgLibMethodInterceptor.connect(kernel.getMBeanServer(), objectName);
        iterations = 1000000;
        for (int i = 0; i < iterations; i++) {
            result = cgLibProxy.echo(msg);
        }
        start = System.currentTimeMillis();
        for (int i = 0; i < iterations; i++) {
            result = cgLibProxy.echo(msg);
        }
        end = System.currentTimeMillis();
        printResults("CGLibProxy", end, start, iterations);
    }

    private static void printResults(String invocationType, long end, long start, int iterations) {
        if(end - start < 400) {
            System.out.println(invocationType + ": elapse time to short to calculate cost (total " + (end - start) + "ms)");
        } else {
            System.out.println(invocationType + ": " + ((end - start) * 1000000.0 / iterations) + "ns  (total " + (end - start) + "ms)");
        }
    }

    public static interface MyInterface {
        void doNothing();
        String echo(String msg);
    }
}
TOP

Related Classes of org.apache.geronimo.gbean.Speed$MyInterface

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.