import java.lang.reflect.Method; public class TimingTest { public interface IFoo { public void foo(); } public interface PubFoo { public void foo(); } public static class Impl implements PubFoo { public void foo(){} } static final int COUNT = 10000000; public static void main(String[] args) throws Exception { Impl impl = new Impl(); int count; startTiming("Bridge (including BCEL)"); IFoo ifoo = Bridge.expose(impl, IFoo.class); stopTiming(); startTiming("Bridge (BCEL loaded)"); Bridge.expose(impl, PubFoo.class); stopTiming(); System.out.println(COUNT+" virtual invocations, warm"); startTiming("Direct"); for(int i=0; i<COUNT; i++) impl.foo(); stopTiming(); Method m = impl.getClass().getMethod("foo",new Class[0]); startTiming("Reflection"); for(int i=0; i<COUNT; i++) m.invoke(impl); stopTiming(); startTiming("Bridge"); for(int i=0; i<COUNT; i++) ifoo.foo(); stopTiming(); System.out.println("1 virtual invocation on "+COUNT+" objects"); startTiming("Direct"); for(int i=0; i<COUNT; i++) impl.foo(); stopTiming(); startTiming("Reflection"); Method tmpM = null; Class[] no_args = new Class[0]; for(int i=0; i<COUNT; i++) { if(tmpM == null || tmpM.getDeclaringClass() != impl.getClass()) tmpM = impl.getClass().getMethod("foo",no_args); tmpM.invoke(impl); } stopTiming(); startTiming("Bridge"); for(int i=0; i<COUNT; i++) { IFoo temp = Bridge.expose(impl, IFoo.class); } stopTiming(); System.out.println(COUNT+" interface invocations, warm"); PubFoo pfoo = (PubFoo)impl; Method mi = impl.getClass().getInterfaces()[0].getMethod("foo", new Class[]{}); IFoo iifoo = Bridge.expose(impl, PubFoo.class, IFoo.class); startTiming("Direct"); for(int i=0; i<COUNT; i++) pfoo.foo(); stopTiming(); startTiming("Reflection"); for(int i=0; i<COUNT; i++) mi.invoke(impl); stopTiming(); startTiming("Bridge"); for(int i=0; i<COUNT; i++) iifoo.foo(); stopTiming(); } static long timer; static void startTiming(String task) { System.out.printf(" * %12s - ", task); System.out.flush(); timer = System.currentTimeMillis(); } static void stopTiming() { long time = System.currentTimeMillis() - timer; System.out.println(time+" ms"); } }
You need to create an account or log in to post comments to this site.