15.1% 0 + 1711 java.lang.reflect.Array.setInt Is definitely pointing at the aset-int as being the time gobbler, I think the expression in the macro should be this
(aset-int (ints arr#) i# (int (~mask-fn (. buf# (~get-fn))))) to be extra safe. On Tue, Mar 31, 2009 at 10:00 PM, Vincent Foley <vfo...@gmail.com> wrote: > > I tried it just now; it made no difference. Nevertheless, thank you > for you help and time! > > On Mar 31, 9:38 pm, David Nolen <dnolen.li...@gmail.com> wrote: > > Did you try > > (int (mask8 (. buf__2572__auto__ (get)))) > > > > ? > > > > Your macro should like this: > > > > (defmacro make-reader > > [get-fn mask-fn] > > `(fn [#^ByteBuffer buf# len#] > > (if (= len# 1) > > (~mask-fn (. buf# (~get-fn))) > > (let [#^"[I" arr# (int-array len#)] > > (dotimes [i# len#] > > (aset-int arr# i# (int (~mask-fn (. buf# (~get-fn)))))) > > arr#)))) > > > > On Tue, Mar 31, 2009 at 9:09 PM, Vincent Foley <vfo...@gmail.com> wrote: > > > > > I tried surrounding the call to the (. buf# (get)) method and putting > > > the coercion directly inside the mask8 and mask16 functions. Neither > > > worked. I want to mention at this point that I have *warn-on- > > > reflection* set to true for the little script that uses the library > > > and it doesn't report any call to methods that it can't resolve. > > > > > Here's the complete -Xprof output, if it helps. > > > > > Flat profile of 176.10 secs (11351 total ticks): main > > > > > Interpreted + native Method > > > 4.5% 511 + 0 java.lang.Integer.hashCode > > > 1.4% 160 + 0 java.lang.Integer.intValue > > > 0.8% 91 + 0 starcraft.replay.unpack > > > $decode_command_block__94.invoke > > > 0.7% 80 + 0 clojure.lang.Numbers.int_array > > > 0.2% 25 + 0 clojure.lang.PersistentVector.pushTail > > > 0.1% 15 + 2 java.lang.ClassLoader.defineClass1 > > > 0.1% 16 + 0 > > > hu.belicza.andras.bwhf.control.BinReplayUnpacker.esi28 > > > 0.1% 4 + 11 clojure.core__init.load > > > 0.1% 10 + 0 clojure.lang.PersistentVector.cons > > > 0.1% 8 + 0 starcraft.replay.actions$fn__71.invoke > > > 0.1% 8 + 0 > > > hu.belicza.andras.bwhf.control.BinReplayUnpacker.unpackSection > > > 0.1% 0 + 7 java.lang.reflect.Array.setInt > > > 0.1% 7 + 0 clojure.lang.PersistentHashMap > > > $BitmapIndexedNode.create > > > 0.1% 7 + 0 clojure.lang.RestFn.invoke > > > 0.1% 7 + 0 clojure.lang.RestFn.invoke > > > 0.1% 7 + 0 starcraft.replay.unpack > > > $decode_commands__99.invoke > > > 0.1% 7 + 0 starcraft.replay.parse > > > $parse_buffer__53$fn__56.invoke > > > 0.1% 6 + 0 clojure.lang.AFn.applyToHelper > > > 0.1% 6 + 0 clojure.lang.PersistentArrayMap.assoc > > > 0.1% 6 + 0 clojure.lang.PersistentHashMap > > > $BitmapIndexedNode.assoc > > > 0.0% 0 + 5 java.lang.reflect.Array.newArray > > > 0.0% 0 + 5 java.lang.Class.forName0 > > > 0.0% 0 + 5 java.util.zip.Inflater.inflateBytes > > > 0.0% 5 + 0 java.lang.AbstractStringBuilder.<init> > > > 0.0% 5 + 0 java.util.Arrays.copyOfRange > > > 10.9% 1157 + 76 Total interpreted (including elided) > > > > > Compiled + native Method > > > 10.4% 1183 + 1 starcraft.replay.parse$fn__23$fn__49.invoke > > > 10.0% 1123 + 17 starcraft.replay.unpack > > > $decode_command_block__94.invoke > > > 9.2% 1043 + 0 clojure.core$next__3096.invoke > > > 8.9% 1014 + 0 starcraft.replay.parse > > > $parse_buffer__53$fn__56.invoke > > > 5.5% 626 + 0 clojure.lang.PersistentArrayMap.assoc > > > 4.3% 474 + 17 clojure.lang.PersistentArrayMap.assoc > > > 4.1% 464 + 7 clojure.lang.RestFn.invoke > > > 2.9% 333 + 0 clojure.lang.Cons.next > > > 2.5% 288 + 0 clojure.lang.RT.seq > > > 2.4% 269 + 0 clojure.lang.AFn.applyToHelper > > > 2.2% 249 + 0 > > > hu.belicza.andras.bwhf.control.BinReplayUnpacker.unpackRepChunk > > > 1.8% 202 + 0 clojure.core$seq__3112.invoke > > > 1.6% 174 + 3 clojure.lang.RestFn.applyTo > > > 1.3% 140 + 2 clojure.lang.APersistentMap.cons > > > 1.2% 130 + 1 clojure.core$spread__3225.invoke > > > 1.1% 127 + 0 clojure.lang.PersistentStructMap.valAt > > > 0.8% 93 + 0 clojure.core$reduce__3304.invoke > > > 0.6% 66 + 2 starcraft.replay.unpack > > > $decode_commands__99.invoke > > > 0.6% 63 + 0 clojure.lang.PersistentArrayMap.valAt > > > 0.1% 13 + 1 clojure.core$conj__3100.invoke > > > 0.1% 9 + 0 clojure.lang.APersistentMap.invoke > > > 0.1% 3 + 6 starcraft.replay.parse > > > $fn__23$read_shorts__37.invoke > > > 0.1% 8 + 0 clojure.core$nthnext__4405.invoke > > > 0.1% 0 + 7 clojure.lang.ArraySeq.next > > > 0.0% 0 + 5 clojure.lang.APersistentVector.assoc > > > 72.3% 8126 + 76 Total compiled (including elided) > > > > > Stub + native Method > > > 15.1% 0 + 1711 java.lang.reflect.Array.setInt > > > 1.2% 0 + 135 java.lang.System.arraycopy > > > 0.3% 0 + 31 java.lang.reflect.Array.set > > > 0.1% 0 + 15 java.io.FileInputStream.readBytes > > > 0.1% 0 + 13 java.lang.reflect.Array.get > > > 0.1% 0 + 7 java.lang.Object.getClass > > > 0.0% 0 + 1 java.lang.Thread.currentThread > > > 16.9% 0 + 1913 Total stub > > > > > Thread-local ticks: > > > 0.0% 1 Class loader > > > 0.0% 2 Unknown: no last frame > > > > > Flat profile of 0.01 secs (1 total ticks): DestroyJavaVM > > > > > Thread-local ticks: > > > 100.0% 1 Blocked (of total) > > > > > Global summary of 176.12 seconds: > > > 100.0% 11603 Received ticks > > > 2.1% 246 Received GC ticks > > > 4.3% 495 Compilation > > > 0.0% 2 Other VM operations > > > 0.0% 1 Class loader > > > 0.0% 2 Unknown code > > > 176.257 secs > > > > > On Mar 31, 8:57 pm, David Nolen <dnolen.li...@gmail.com> wrote: > > > > Thanks to cl-format: > > > > > > (fn > > > > [buf__2572__auto__ len__2573__auto__] > > > > (if (= len__2573__auto__ 1) > > > > (mask8 (. buf__2572__auto__ (get))) > > > > (let [arr__2574__auto__ (int-array len__2573__auto__)] > > > > (dotimes > > > > [i__2575__auto__ len__2573__auto__] > > > > (aset-int > > > > arr__2574__auto__ > > > > i__2575__auto__ > > > > (mask8 (. buf__2572__auto__ (get))))) > > > > arr__2574__auto__))) > > > > > > This is the expansion for (make-reader get mask8), where were you > > > attempting > > > > putting the int coercion to to the mask-fn? > > > > > > David > > > > > > On Tue, Mar 31, 2009 at 11:38 AM, Vincent Foley <vfo...@gmail.com> > > > wrote: > > > > > > > I tried using aset-int and I tried using int to coerce the result > of > > > > > mask-fn, the input argument to mask-fn and few other things, but > none > > > > > of that seems to make a difference so far. Mind you, this is an > > > > > aspect of Clojure that I find a little confusing, so I'm just > putting > > > > > int calls here and there and looking at what happens. > > > > > > > On Mar 31, 10:46 am, Christophe Grand <christo...@cgrand.net> > wrote: > > > > > > Did you try to coerce the result of (~mask-fn ...) with int? > > > > > > (or use aset-int as suggested by David) > > > > > > > > On Tue, Mar 31, 2009 at 4:17 PM, Vincent Foley <vfo...@gmail.com > > > > > wrote: > > > > > > > > > No, but in my defense I did not know such a function existed :) > > > I'll > > > > > > > give it a whirl and report back! > > > > > > > > > On Mar 31, 9:57 am, David Nolen <dnolen.li...@gmail.com> > wrote: > > > > > > > > Did you try using aset-int instead of aset? > > > > > > > > > > On Tue, Mar 31, 2009 at 8:25 AM, Vincent Foley < > vfo...@gmail.com > > > > > > > wrote: > > > > > > > > > > > For those interested, I managed to improve the performance > of > > > my > > > > > > > > > original program from 2 minutes 40 seconds to decode 1000+ > > > files > > > > > down > > > > > > > > > to 2 minutes. I'm still far from my goal, but it's an > > > improvement, > > > > > > > > > especially since the code is shorter and (IMO) cleaner. > You > > > can > > > > > see > > > > > > > > > it here: > > > > > > > > http://bitbucket.org/gnuvince/clj-starcraft/src/tip/src/starcraft/rep. > > > > > > > .. > > > > > > > > > > > And here's another question, running the program with > -Xprof > > > shows > > > > > > > > > that nearly 20% of my execution time is spent calling > > > > > > > > > java.lang.reflect.Array.set. Is there something wrong with > the > > > way > > > > > I > > > > > > > > > type hint my array in make-reader? > > > > > > > > > > > Thanks, > > > > > > > > > > > Vincent. > > > > > > > > > > > On Mar 19, 8:12 pm, Vincent Foley <vfo...@gmail.com> > wrote: > > > > > > > > > > Hello, > > > > > > > > > > > > For the past few days, I've been trying, unsuccessfully, > to > > > make > > > > > an > > > > > > > > > > application I wrote faster. A Java program that > performs, > > > more > > > > > or > > > > > > > > > > less, the same task takes 12 seconds (on my machine) to > parse > > > > > 1000 > > > > > > > > > > files; my Clojure program takes nearly 3 minutes. This > more > > > than > > > > > an > > > > > > > > > > order of magnitude slower! Using the profiling tools > > > available > > > > > with > > > > > > > > > > the JVM, I quickly determined which function was the > > > costliest. > > > > > I > > > > > > > > > > copied it into a simple script file to profile it in > > > isolation. > > > > > I > > > > > > > > > > have made the script and the profile results (long!) > > > available at > > > > > > > this > > > > > > > > > > URL:http://gist.github.com/82136 > > > > > > > > > > > > I'm finding the results puzzling: is dereferencing a var > > > *that* > > > > > > > > > > expensive? Can anyone tell me if they see something > > > > > fundamentally > > > > > > > > > > wrong with my approach that would explain this abysmal > > > > > performance? > > > > > > > > > > > > Thank you, > > > > > > > > > > > > Vincent. > > > > > > > > > > > > P.S.: I am using Sun's JVM 1.6.0_10 as shipped in Ubuntu > > > Ibex. > > > > > My > > > > > > > > > > machine is an Athlon 64 X2 4200+ with 3 GB of RAM. > > > > > > > --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---