There's several ways the performance of this code can be improved.

Firstly, these are exactly the same (samantically), but the latter is much
faster: (go (>! c v)) and (put! c v). Use put! whenever possible.

Secondly, the function "event" uses <!! (blocking take), but it's used
inside a go later on. Don't do this, it can cause issues in the go's fixed
thread pool.

I think you can also improve this code quite a bit by reducing the number
of puts/takes the system is doing. So consider changing this:

(defn event [env type val]
  (let [rc (async/chan)]
    (async/<!!
     (async/go
      (async/>! (:queue @env)
                {:type type :val val :rc rc :time (:now @env)})
      (async/<! rc)
      (async/close! rc)))))

(event ....)

To this:


(defn event [env type val]
  (let [rc (async/chan)]
     (*put!*
      (:queue @env)
      {:type type :val val :rc rc :time (:now @env)}))
  rc))

(<! (event ...))

I have not benchmarked this new code, but it should run much faster. Timothy



On Fri, Nov 29, 2013 at 5:04 PM, kandre <andreas.koest...@gmail.com> wrote:

> Here is the gist: https://gist.github.com/anonymous/7713596
> Please not that there's no ordering of time for this simple example and
> there's only one event (timeout). This is not what I intend to use but it
> shows the problem.
> Simulating 10^5 steps this way takes ~1.5s
>
> Cheers
> Andreas
>
> On Saturday, 30 November 2013 09:31:08 UTC+10:30, kandre wrote:
>>
>> I think I can provide you with a little code snipped.
>> I am talking about the very basic car example
>> (driving->parking->driving). Running the sim using core.async takes about
>> 1s for 10^5 steps whereas the simpy version takes less than 1s for 10^6
>> iterations on my vm.
>> Cheers
>> Andreas
>>
>> On Saturday, 30 November 2013 09:22:22 UTC+10:30, Ben Mabey wrote:
>>>
>>> On Fri Nov 29 14:13:16 2013, kandre wrote:
>>> > Thanks for all the replies. I accidentally left out the close! When I
>>> contrived the example. I am using core.async for a discrete event
>>> simulation system. There are hundreds of go blocks all doing little but
>>> putting a sequence of events onto
>>
>>
>
>> a channel and one go block advancing taking these events and advancing
>>> the time similar to simpy.readthedocs.org/
>>> >
>>> > The basic one car example under the previous link executes about 10
>>> times faster than the same example using core.a sync.
>>> >
>>>
>>> Hi Andreas,
>>> I've been using core.async for DES as well since I think the
>>> process-based approach is useful.  I could try doing the same
>>> simulation you're attempting to see how my approach compares
>>> speed-wise.  Are you talking about the car wash or the gas station
>>> simulation?  Posting a gist of what you have will be helpful so I can
>>> use the same parameters.
>>>
>>> -Ben
>>>
>>>
>>>
>>>
>>>  --
> --
> 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
> ---
> You received this message because you are subscribed to the Google Groups
> "Clojure" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to clojure+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/groups/opt_out.
>



-- 
“One of the main causes of the fall of the Roman Empire was that–lacking
zero–they had no way to indicate successful termination of their C
programs.”
(Robert Firth)

-- 
-- 
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
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to