Proxy Perf Test
/* Pro Spring By Rob Harrop Jan Machacek ISBN: 1-59059-461-4 Publisher: Apress */ /////////////////////////////////////////////////////////////////////////////////////// public interface ISimpleBean { public void advised(); public void unadvised(); } /////////////////////////////////////////////////////////////////////////////////////// public class SimpleBean implements ISimpleBean { private long dummy = 0; public void advised() { dummy = System.currentTimeMillis(); } public void unadvised() { dummy = System.currentTimeMillis(); } } /////////////////////////////////////////////////////////////////////////////////////// import java.lang.reflect.Method; import org.springframework.aop.MethodBeforeAdvice; public class NoOpBeforeAdvice implements MethodBeforeAdvice { public void before(Method method, Object[] args, Object target) throws Throwable { // no-op } } /////////////////////////////////////////////////////////////////////////////////////// import java.lang.reflect.Method; import org.springframework.aop.support.StaticMethodMatcherPointcut; public class TestPointcut extends StaticMethodMatcherPointcut { public boolean matches(Method method, Class cls) { return ("advised".equals(method.getName())); } } /////////////////////////////////////////////////////////////////////////////////////// import org.springframework.aop.Advisor; import org.springframework.aop.framework.Advised; import org.springframework.aop.framework.ProxyFactory; import org.springframework.aop.support.DefaultPointcutAdvisor; public class ProxyPerfTest { public static void main(String[] args) { ISimpleBean target = new SimpleBean(); Advisor advisor = new DefaultPointcutAdvisor(new TestPointcut(), new NoOpBeforeAdvice()); runCglibTests(advisor, target); runCglibFrozenTests(advisor, target); runJdkTests(advisor, target); } private static void runCglibTests(Advisor advisor, ISimpleBean target) { ProxyFactory pf = new ProxyFactory(); pf.setTarget(target); pf.addAdvisor(advisor); ISimpleBean proxy = (ISimpleBean)pf.getProxy(); System.out.println("Running CGLIB (Standard) Tests"); test(proxy); } private static void runCglibFrozenTests(Advisor advisor, ISimpleBean target) { ProxyFactory pf = new ProxyFactory(); pf.setTarget(target); pf.addAdvisor(advisor); pf.setFrozen(true); ISimpleBean proxy = (ISimpleBean)pf.getProxy(); System.out.println("Running CGLIB (Frozen) Tests"); test(proxy); } private static void runJdkTests(Advisor advisor, ISimpleBean target) { ProxyFactory pf = new ProxyFactory(); pf.setTarget(target); pf.addAdvisor(advisor); pf.setInterfaces(new Class[]{ISimpleBean.class}); ISimpleBean proxy = (ISimpleBean)pf.getProxy(); System.out.println("Running JDK Tests"); test(proxy); } private static void test(ISimpleBean bean) { long before = 0; long after = 0; // test advised method System.out.println("Testing Advised Method"); before = System.currentTimeMillis(); for(int x = 0; x < 500000; x++) { bean.advised(); } after = System.currentTimeMillis();; System.out.println("Took " + (after - before) + " ms"); // testing unadvised method System.out.println("Testing Unadvised Method"); before = System.currentTimeMillis(); for(int x = 0; x < 500000; x++) { bean.unadvised(); } after = System.currentTimeMillis();; System.out.println("Took " + (after - before) + " ms"); // testing equals() method System.out.println("Testing equals() Method"); before = System.currentTimeMillis(); for(int x = 0; x < 500000; x++) { bean.equals(bean); } after = System.currentTimeMillis();; System.out.println("Took " + (after - before) + " ms"); // testing hashCode() method System.out.println("Testing hashCode() Method"); before = System.currentTimeMillis(); for(int x = 0; x < 500000; x++) { bean.hashCode(); } after = System.currentTimeMillis();; System.out.println("Took " + (after - before) + " ms"); // testing method on Advised Advised advised = (Advised)bean; System.out.println("Testing Advised.getProxyTargetClass() Method"); before = System.currentTimeMillis(); for(int x = 0; x < 500000; x++) { advised.getProxyTargetClass(); } after = System.currentTimeMillis();; System.out.println("Took " + (after - before) + " ms"); System.out.println(">>>\n"); } }