As as a side note, putting type hints into the body of the macro expansion doesn't do anything. These will be discarded. You will need to coerce types via other methods, investigating how ints is implemented in core.clj is a good place to start. On Tue, Mar 31, 2009 at 11:04 PM, David Nolen <dnolen.li...@gmail.com>wrote:
> 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 -~----------~----~----~----~------~----~------~--~---