On Dec 21, 2012, at 5:22 PM, Marshall Bockrath-Vandegrift wrote:
> Not to the bottom of things yet, but found some low-hanging fruit –
> switching the `push-state` from a struct-map to a record gives a flat
> ~2x speedup in all configurations I tested. So, that’s good?
I really appreciate your attention to this Marshall.
FWIW I used records for push-states at one point but did not observe a speedup
and it required much messier code, so I reverted to struct-maps. But maybe I
wasn't doing the right timings. I'm curious about how you changed to records
without the messiness. I'll include below my sig the way that I had to do it...
maybe you can show me what you did instead.
Still, I guess the gorilla in the room, which is eating the multicore
performance, hasn't yet been found.
-Lee
--- tl;dr: the structs vs. records thing ---
Here's how I do what I need to do with struct-maps:
;; this is defined elsewhere, and I want push-states to have fields for each
push-type that's defined here
(def push-types '(:exec :integer :float :code :boolean :string :zip
:tag :auxiliary :return :environment)
;; so I use a macro to produce the struct-map definition
(defmacro define-push-state-structure []
`(defstruct push-state ~@push-types))
;; call the macro to define the struct
(define-push-state-structure)
;; and then when I want a new push-state I can just call struct-map:
(defn make-push-state
"Returns an empty push state."
[]
(struct-map push-state))
In order to do the same thing with records I had to resort to this:
(defn keyword->symbol [kwd]
"Returns the symbol obtained by removing the : from a keyword."
(read-string (name kwd)))
(defmacro define-push-state-record-type []
"Defines the pushstate record type. The odd trick with read-string was a hack
to
avoid namespace qualification on the pushstate symbol."
`(defrecord ~(read-string "pushstate") [~@(map keyword->symbol push-types)]))
(define-push-state-record-type)
(defmacro make-push-state
"Returns an empty push state."
[]
`(pushstate. ~@(map (fn [_] nil) push-types)))
Is there a much simpler way that I overlooked?
--
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