Would type hints help at all?
On May 29, 11:40 am, Laurent PETIT <laurent.pe...@gmail.com> wrote:
> Hi,
>
> Here is my attempt, for the real benchmark test, it has an honorable
> result of 62 sec. (if there is no flaw in my algorithm, of course).
>
> ;; file shootout/ring.clj
> (ns shootout.ring
> (:gen-class))
>
> (def n-threads 503)
> (def nb-pass 50000000)
>
> (defn main
> "main function calling the benchmark test."
> [n-threads N print-result-fn]
> (let [start-time (System/nanoTime)
> agents (into [] (map #(agent {:name (inc %)}) (range n-threads)))
> send-to (fn this [i token-val]
> (send (nth agents (mod i n-threads))
> (fn [state t-val]
> (if (= t-val N)
> (print-result-fn (:name state) start-time)
> (this (inc i) (inc t-val)))
> state)
> token-val))]
> (send-to 0 0)
> nil))
>
> (defn repl-print-result-fn [thread-id start-time]
> (println "\n"
> "thread number: " thread-id "\n"
> "time (secs): " (/ (- (System/nanoTime) start-time)
> 1000000000.0)))
>
> (defn benchmark-print-result-fn [thread-id _]
> (println thread-id))
>
> (defn -main []
> (main n-threads nb-pass benchmark-print-result-fn))
>
> (defn repl-test [nb-pass]
> (main n-threads nb-pass repl-print-result-fn))
>
> ;; repl session
> Clojure
> 1:1 user=> (use 'shootout.ring)
> nil
> 1:2 user=> (do (repl-test 1000) (repl-test 50000000))
> nil
> 1:3 user=>
> thread number: 498
> time (secs): 0.128037133
>
> thread number: 292
> time (secs): 62.724999733
>
> on a recent machine
>
> (and yes, I know something similar is on the clojure agents page, but
> sometimes it's rewarding not to look at the solution too early :-)
>
> Cheers,
>
> --
> Laurent
>
> 2009/5/29 Alvaro Vilanova Vidal <alv...@gmail.com>:
>
> > Thanks, seems that I misunderstood Agents :)
>
> > The solution of Christian works well with full load, but maybe slow for the
> > benchmark. In my core2duo, with full load, takes about 28mins to compute the
> > result.
>
> > user=> (do (println (System/nanoTime)) (start 50000000))
> > 22651751153117
> > #<ag...@27a897a9: 1>
> > user=> 292 ( 24319344452689 )
> > user=> (/ (- 24319344452689 22651751153117) 60000000000.0)
> > 27.793221659533334
>
> > 2009/5/29 Christian Vest Hansen <karmazi...@gmail.com>
>
> >> On Fri, May 29, 2009 at 4:29 PM, Laurent PETIT <laurent.pe...@gmail.com>
> >> wrote:
> >> > when I try it with the 50,000,000 number of times the token is
> >> > exchanged (which is the number to be used for the benchmark)
>
> >> Oh, right. I only noticed the 1000 mentioned at the bottom. Also, the
> >> (time ...) makes no sense.
>
> >> > How would one fix this?
>
> >> With a CountDownLatch? That's what I'm currently trying.
>
> >> > 2009/5/29 Christian Vest Hansen <karmazi...@gmail.com>:
>
> >> >> For kicks, I made an implementation* using agents:
>
> >> >>http://gist.github.com/119946
>
> >> >> I think that you may not want to use the STM so much and instead
> >> >> figure out a different approach to sending the token around the ring.
>
> >> >> *it may be a bit liberal in its interpretation of the rules... didn't
> >> >> read them that carefully.
>
> >> >> On Fri, May 29, 2009 at 2:32 PM, Alvaro Vilanova Vidal
> >> >> <alv...@gmail.com> wrote:
>
> >> >>> Hi everyone,
> >> >>> I am a newbie in clojure world, so I have some newbie's questions :)
> >> >>> To
> >> >>> learn about clojure, I am trying to do the thread ring problem of clgb
> >> >>> in
> >> >>> clojure. The rules of problem are here, and my attempt here. It seems
> >> >>> that
> >> >>> works well, but I can only test it with a small load (5 - 15 threads,
> >> >>> 503 is
> >> >>> the target) because it runs extremely slow. I tried to use atoms,
> >> >>> hints, and
> >> >>> change the implementation, but always is slower. What am I doing
> >> >>> wrong? And,
> >> >>> by the way, why can't I compile the class?
>
> >> >>> Thanks a lot.
>
> >> >> --
> >> >> Venlig hilsen / Kind regards,
> >> >> Christian Vest Hansen.
>
> >> --
> >> Venlig hilsen / Kind regards,
> >> Christian Vest Hansen.
>
> > --
> > Álvaro Vilanova,
> >http://alvivi.com
--~--~---------~--~----~------------~-------~--~----~
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
Note that posts from new members are moderated - please be patient with your
first post.
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
-~----------~----~----~----~------~----~------~--~---