001 package groovy.lang; 002 003 import java.util.*; 004 005 /** 006 * Interceptor that registers the timestamp of each method call 007 * before and after invocation. 008 */ 009 public class BenchmarkInterceptor implements Interceptor { 010 011 protected Map calls = new HashMap(); // keys to list of invokation times and before and after 012 013 014 public Map getCalls() { 015 return calls; 016 } 017 public void reset() { 018 calls = new HashMap(); 019 } 020 021 public Object beforeInvoke(Object object, String methodName, Object[] arguments) { 022 if (!calls.containsKey(methodName)) calls.put(methodName, new LinkedList()); 023 ((List) calls.get(methodName)).add(new Long(System.currentTimeMillis())); 024 025 return null; 026 } 027 028 public Object afterInvoke(Object object, String methodName, Object[] arguments, Object result) { 029 ((List) calls.get(methodName)).add(new Long(System.currentTimeMillis())); 030 return result; 031 } 032 033 public boolean doInvoke() { 034 return true; 035 } 036 037 /** 038 * @return a list of lines, each item is [methodname, numberOfCalls, accumulatedTime] 039 */ 040 public List statistic() { 041 List result = new LinkedList(); 042 for (Iterator iter = calls.keySet().iterator(); iter.hasNext();) { 043 Object[] line = new Object[3]; 044 result.add(line); 045 line[0] = (String) iter.next(); 046 List times = (List) calls.get(line[0]); 047 line[1] = new Integer(times.size() / 2); 048 int accTime = 0; 049 for (Iterator it = times.iterator(); it.hasNext();) { 050 Long start = (Long) it.next(); 051 Long end = (Long) it.next(); 052 accTime += end.longValue() - start.longValue(); 053 } 054 line[2] = new Long(accTime); 055 } 056 return result; 057 } 058 }