Some naive caching code does speed up my sample by 4 times. Will investigate further later this week, need to take my flu to bed now..
diff --git a/src/jvm/clojure/lang/Reflector.java b/src/jvm/clojure/lang/Reflector.java index f530b78..eccebb8 100644 --- a/src/jvm/clojure/lang/Reflector.java +++ b/src/jvm/clojure/lang/Reflector.java @@ -296,7 +296,21 @@ static public Field getField(Class c, String name, boolean getStatics){ return null; } +static private java.util.Map<String,List> methodsCache = new java.util.HashMap<String,List>(); + static public List getMethods(Class c, int arity, String name, boolean getStatics){ + synchronized (methodsCache) { + String key = "" + c + "-" + arity + " " + name + " " + getStatics; + if (methodsCache.containsKey(key)) { + return methodsCache.get(key); + } else { + List methods = originalGetMethods(c, arity, name, getStatics); + methodsCache.put(key, methods); + return methods; + } + } +} +static public List originalGetMethods(Class c, int arity, String name, boolean getStatics){ Method[] allmethods = c.getMethods(); ArrayList methods = new ArrayList(); ArrayList bridgeMethods = new ArrayList(); On Sat, Jan 31, 2009 at 3:55 PM, Remco van 't Veer <rwvtv...@gmail.com> wrote: > I've been playing around with clojure on the android platform. To my > surprise it was pretty easy to get running, after removing the bean > method from the clojure.jar as hinted by Rich somewhere. Of course > clojure code needs to be compiled AOT and eval doesn't work, as was to > be expected, but all seems to run fine otherwise. > > There's a problem though, it's really slow.. I've played around with > the tracing tools of the android sdk and noticed about half of the > time spend is doing reflection related things. Reflection on Android/ > Dalvik is known to be slow. At the top of the method list sorted by > exclusive times is clojure/lang/Reflector.getMethods with a 10% score > of total time spend, followed by java/lang/reflect/ > ReflectionAccessImpl.clone, java/lang/reflect/Method.<init>, java/ > lang/ClassCache.deepCopy, java/lang/reflect/Method.getName and java/ > lang/String.equals and java/lang/reflect/AccessibleObject.<init>. > > My test case was pretty simpel; get the public-time-line from twitter, > parse it with xml/parse (needs a small tweak to work on android btw), > populate some struct-maps and display a listview. Unfortunately this > simple task takes about 12 seconds to complete on a g1 phone. > > So I setup *warn-on-reflection* and put type hints in all the > appropriate places but didn't detect any performance improvements. > Then I ran compile-clojure in the clojure source tree with an adjusted > compiler to see the reflection warning in the core. This yields about > 40 warnings and I wonder if fixing those will improve performance at > all. > > Another approach is to try and speedup clojure/lang/ > Reflector.getMethods by caching results. Any idea's on what route > will get me the best results? > > Thanks, > Remco --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en -~----------~----~----~----~------~----~------~--~---