You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ode.apache.org by ha...@apache.org on 2012/12/14 22:09:14 UTC

svn commit: r1422087 - in /ode/trunk/jacob/src: main/java/org/apache/ode/jacob/vpu/ test/java/org/apache/ode/jacob/vpu/

Author: hadrian
Date: Fri Dec 14 21:09:12 2012
New Revision: 1422087

URL: http://svn.apache.org/viewvc?rev=1422087&view=rev
Log:
Add ProxyConstructor for faster proxy creation

Added:
    ode/trunk/jacob/src/main/java/org/apache/ode/jacob/vpu/ProxyConstructor.java   (with props)
    ode/trunk/jacob/src/test/java/org/apache/ode/jacob/vpu/
    ode/trunk/jacob/src/test/java/org/apache/ode/jacob/vpu/ProxyConstructorTimingTest.java   (with props)
Modified:
    ode/trunk/jacob/src/main/java/org/apache/ode/jacob/vpu/ExecutionQueueImpl.java

Modified: ode/trunk/jacob/src/main/java/org/apache/ode/jacob/vpu/ExecutionQueueImpl.java
URL: http://svn.apache.org/viewvc/ode/trunk/jacob/src/main/java/org/apache/ode/jacob/vpu/ExecutionQueueImpl.java?rev=1422087&r1=1422086&r2=1422087&view=diff
==============================================================================
--- ode/trunk/jacob/src/main/java/org/apache/ode/jacob/vpu/ExecutionQueueImpl.java (original)
+++ ode/trunk/jacob/src/main/java/org/apache/ode/jacob/vpu/ExecutionQueueImpl.java Fri Dec 14 21:09:12 2012
@@ -96,8 +96,6 @@ public class ExecutionQueueImpl implemen
 
     private int _objIdCounter;
 
-    private ExecutionQueueStatistics _statistics = new ExecutionQueueStatistics();
-
     private ReplacementMap _replacementMap;
 
     private Serializable _gdata;
@@ -380,7 +378,6 @@ public class ExecutionQueueImpl implemen
         ps.println("-- GENERAL INFO");
         ps.println("   Current Cycle          : " + _currentCycle);
         ps.println("   Num. Reactions  : " + _reactions.size());
-        _statistics.printStatistics(ps);
         if (!_reactions.isEmpty()) {
             ps.println("-- REACTIONS");
             int cnt = 0;

Added: ode/trunk/jacob/src/main/java/org/apache/ode/jacob/vpu/ProxyConstructor.java
URL: http://svn.apache.org/viewvc/ode/trunk/jacob/src/main/java/org/apache/ode/jacob/vpu/ProxyConstructor.java?rev=1422087&view=auto
==============================================================================
--- ode/trunk/jacob/src/main/java/org/apache/ode/jacob/vpu/ProxyConstructor.java (added)
+++ ode/trunk/jacob/src/main/java/org/apache/ode/jacob/vpu/ProxyConstructor.java Fri Dec 14 21:09:12 2012
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.ode.jacob.vpu;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Proxy;
+
+
+/**
+ * Interface implemented by channel proxies.
+ */
+public class ProxyConstructor<T> {
+	private Constructor<T> constructor;
+	@SuppressWarnings("unchecked")
+	public ProxyConstructor(Class<T> clazz) {
+	    try {
+		    Class<?> proxyClass = Proxy.getProxyClass(clazz.getClassLoader(), new Class[] {clazz});
+			constructor = (Constructor<T>) proxyClass.getConstructor(new Class[] { InvocationHandler.class });
+		} catch (Exception e) {
+			// TODO: ignore? LOG?
+		}
+	}
+	
+	public T newInstance(InvocationHandler handler) {
+		try {
+			return constructor != null ? (T)constructor.newInstance(handler) : null;
+		} catch (Exception e) {
+			// TODO: really ignore?
+		}
+		return null;
+	}
+}

Propchange: ode/trunk/jacob/src/main/java/org/apache/ode/jacob/vpu/ProxyConstructor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: ode/trunk/jacob/src/test/java/org/apache/ode/jacob/vpu/ProxyConstructorTimingTest.java
URL: http://svn.apache.org/viewvc/ode/trunk/jacob/src/test/java/org/apache/ode/jacob/vpu/ProxyConstructorTimingTest.java?rev=1422087&view=auto
==============================================================================
--- ode/trunk/jacob/src/test/java/org/apache/ode/jacob/vpu/ProxyConstructorTimingTest.java (added)
+++ ode/trunk/jacob/src/test/java/org/apache/ode/jacob/vpu/ProxyConstructorTimingTest.java Fri Dec 14 21:09:12 2012
@@ -0,0 +1,167 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.ode.jacob.vpu;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+
+import junit.framework.TestCase;
+
+
+public class ProxyConstructorTimingTest extends TestCase {
+	private static final long COUNT = 1000000L;
+    public ProxyConstructorTimingTest(String testName) {
+        super(testName);
+    }
+
+    public void testDoNothing() throws Exception {
+    }
+
+    public interface TestExecution {
+        public void execute() throws Exception;	
+    }
+
+    public class RepeatExecution implements TestExecution {
+    	private final long count;
+    	private final TestExecution test;
+    	public RepeatExecution(long count, TestExecution test) {
+    		this.count = count;
+    		this.test = test;
+    	}
+        public void execute() throws Exception {
+        	for (long i = 0; i < count; i++) {
+        		test.execute();
+        	}
+        }
+    }
+
+    public class TimedExecution implements TestExecution {
+    	private final String name;
+    	private final TestExecution test;
+    	public TimedExecution(String name, TestExecution test) {
+    		this.name = name;
+    		this.test = test;
+    	}
+        public void execute() throws Exception {
+        	NanoTimer timer = new NanoTimer().start();
+        	test.execute();
+        	System.out.println("TimedExecution(" + name + "): " + timer.stop() + "[ns]");
+        }
+    }
+
+    public void timedRepeatedExecution(String name, TestExecution test) throws Exception {
+    	new TimedExecution(name, new RepeatExecution(COUNT, test)).execute();
+    }
+
+    public void manualTestProxyTiming() throws Exception {
+    	timedRepeatedExecution("direct invocation", new TestExecution() {
+			@Override
+			public void execute() throws Exception {
+				// Create new instance every time
+	            new GreeterImpl2().hello("World");
+			}
+    	});
+
+    	timedRepeatedExecution("newProxyInstance", new TestExecution() {
+			@Override
+			public void execute() throws Exception {
+	    	    Greeter gp = (Greeter) Proxy.newProxyInstance(Greeter.class.getClassLoader(),
+    	            new Class<?>[] {Greeter.class}, new GreeterInvocationHandler(new GreeterImpl2()));
+        		gp.hello("World");
+			}
+    	});
+
+	    final ProxyConstructor<Greeter> helper = new ProxyConstructor<Greeter>(Greeter.class);
+    	timedRepeatedExecution("ProxyConstructor", new TestExecution() {
+			@Override
+			public void execute() throws Exception {
+	    	    Greeter gp = (Greeter) helper.newInstance(new GreeterInvocationHandler(new GreeterImpl2()));
+	    	    gp.hello("World");
+			}
+    	});
+    }
+    
+    public interface Greeter {
+    	String hello(String name);
+    }
+    
+    public class GreeterImpl implements Greeter {
+		public String hello(String name) {
+			return "Hello " + name;
+		}
+    }
+
+    public class GreeterImpl2 implements Greeter {
+		public String hello(String name) {
+			return "";
+		}
+    }
+
+    public class GreeterInvocationHandler implements InvocationHandler {
+    	private Object greeter;
+    	GreeterInvocationHandler(Object o) {
+    		greeter = o;
+    	}
+
+    	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+		   if(Object.class  == method.getDeclaringClass()) {
+		       String name = method.getName();
+		       if("equals".equals(name)) {
+		           return proxy == args[0];
+		       } else if("hashCode".equals(name)) {
+		           return System.identityHashCode(proxy);
+		       } else if("toString".equals(name)) {
+		           return proxy.getClass().getName() + "@" +
+		               Integer.toHexString(System.identityHashCode(proxy)) +
+		               ", with InvocationHandler " + this;
+		       } else {
+		           throw new IllegalStateException(String.valueOf(method));
+		       }
+		   }
+		   return method.invoke(greeter, args);
+		}	
+    }
+
+    // TODO: may be useful for other things? move it somewhere else?
+    public class NanoTimer {
+    	private long start;
+    	private long lap;
+    	// TODO: we could also count laps...
+    	public NanoTimer() {
+    		// don't start by default, easy to just call .start();
+    	}
+    	public NanoTimer start() {
+    		start = System.nanoTime();
+    		lap = start;
+    		return this;
+    	}
+    	public long stop() {
+    		long span = System.nanoTime() - start;
+    		start = 0;
+    		lap = 0;
+    		return span;
+    	}
+    	public long lap() {
+    		long prev = lap;
+    		lap = (start != 0) ? System.nanoTime() : 0;
+    		return lap - prev;
+    	}
+    }
+}

Propchange: ode/trunk/jacob/src/test/java/org/apache/ode/jacob/vpu/ProxyConstructorTimingTest.java
------------------------------------------------------------------------------
    svn:eol-style = native