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
-~----------~----~----~----~------~----~------~--~---

Reply via email to