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 <[email protected]>:
> 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 <[email protected]>
>>
>> On Fri, May 29, 2009 at 4:29 PM, Laurent PETIT <[email protected]>
>> 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 <[email protected]>:
>> >>
>> >> 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
>> >> <[email protected]> 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 [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---