OK, it appears defrecord suffers from a problem that used to plague Scala
case classes as well - http://issues.scala-lang.org/browse/SI-2537.

David

On Thu, Oct 24, 2013 at 8:08 AM, Paul Butcher <p...@paulbutcher.com> wrote:

> On 23 Oct 2013, at 18:37, David Nolen <dnolen.li...@gmail.com> wrote:
>
> The problem here is that you're not following your Scala solution closely
> enough. I suspect if you used defrecords to represent the pieces the way
> that you used a class in Scala you can avoid the number of collisions for
> larger problems.
>
> Not tested much but I tried something like the following and I no longer
> see hash collisions dominating in YourKit:
>
>
> It would be lovely if it was that easy, David. However, I still see lots
> of hash collisions when using records. Here's a portion of the output from
> an implementation that's instrumented to print hash codes, similar to what
> Andy did with the vector-based implementation:
>
> "842565000: #{#chess_clojure.core.Piece{:name :Q, :pos [3 2]}
> #chess_clojure.core.Piece{:name :B, :pos [1 5]}
> #chess_clojure.core.Piece{:name :N, :pos [0 1]}
> #chess_clojure.core.Piece{:name :R, :pos [8 4]}}"
> "842565000: #{#chess_clojure.core.Piece{:name :N, :pos [0 4]}
> #chess_clojure.core.Piece{:name :Q, :pos [3 3]}
> #chess_clojure.core.Piece{:name :B, :pos [1 0]}
> #chess_clojure.core.Piece{:name :R, :pos [8 5]}}"
> "842565000: #{#chess_clojure.core.Piece{:name :N, :pos [0 4]}
> #chess_clojure.core.Piece{:name :Q, :pos [3 3]}
> #chess_clojure.core.Piece{:name :B, :pos [1 4]}
> #chess_clojure.core.Piece{:name :R, :pos [8 1]}}"
> "842565000: #{#chess_clojure.core.Piece{:name :N, :pos [0 3]}
> #chess_clojure.core.Piece{:name :Q, :pos [3 4]}
> #chess_clojure.core.Piece{:name :B, :pos [1 0]}
> #chess_clojure.core.Piece{:name :R, :pos [8 5]}}"
> "842565000: #{#chess_clojure.core.Piece{:name :N, :pos [0 3]}
> #chess_clojure.core.Piece{:name :Q, :pos [3 5]}
> #chess_clojure.core.Piece{:name :B, :pos [1 0]}
> #chess_clojure.core.Piece{:name :R, :pos [8 4]}}"
> "842565000: #{#chess_clojure.core.Piece{:name :R, :pos [0 3]}
> #chess_clojure.core.Piece{:name :Q, :pos [4 2]}
> #chess_clojure.core.Piece{:name :B, :pos [1 0]}
> #chess_clojure.core.Piece{:name :N, :pos [8 0]}}"
> "842565000: #{#chess_clojure.core.Piece{:name :R, :pos [0 3]}
> #chess_clojure.core.Piece{:name :Q, :pos [3 4]}
> #chess_clojure.core.Piece{:name :B, :pos [1 5]}
> #chess_clojure.core.Piece{:name :N, :pos [8 0]}}"
> "842565000: #{#chess_clojure.core.Piece{:name :Q, :pos [3 2]}
> #chess_clojure.core.Piece{:name :B, :pos [1 5]}
> #chess_clojure.core.Piece{:name :R, :pos [0 0]}
> #chess_clojure.core.Piece{:name :N, :pos [8 5]}}"
> "842565000: #{#chess_clojure.core.Piece{:name :Q, :pos [4 2]}
> #chess_clojure.core.Piece{:name :R, :pos [1 1]}
> #chess_clojure.core.Piece{:name :B, :pos [0 5]}
> #chess_clojure.core.Piece{:name :N, :pos [8 5]}}"
> "842565000: #{#chess_clojure.core.Piece{:name :Q, :pos [3 2]}
> #chess_clojure.core.Piece{:name :R, :pos [1 1]}
> #chess_clojure.core.Piece{:name :B, :pos [0 4]}
> #chess_clojure.core.Piece{:name :N, :pos [8 5]}}"
> "842565000: #{#chess_clojure.core.Piece{:name :R, :pos [0 3]}
> #chess_clojure.core.Piece{:name :Q, :pos [3 4]}
> #chess_clojure.core.Piece{:name :B, :pos [1 0]}
> #chess_clojure.core.Piece{:name :N, :pos [8 5]}}"
> "842565000: #{#chess_clojure.core.Piece{:name :Q, :pos [3 4]}
> #chess_clojure.core.Piece{:name :R, :pos [1 1]}
> #chess_clojure.core.Piece{:name :B, :pos [0 5]}
> #chess_clojure.core.Piece{:name :N, :pos [8 2]}}"
> "842565000: #{#chess_clojure.core.Piece{:name :Q, :pos [3 5]}
> #chess_clojure.core.Piece{:name :R, :pos [1 1]}
> #chess_clojure.core.Piece{:name :B, :pos [0 4]}
> #chess_clojure.core.Piece{:name :N, :pos [8 2]}}"
> "842565000: #{#chess_clojure.core.Piece{:name :Q, :pos [3 4]}
> #chess_clojure.core.Piece{:name :B, :pos [1 5]}
> #chess_clojure.core.Piece{:name :R, :pos [0 2]}
> #chess_clojure.core.Piece{:name :N, :pos [8 1]}}"
> "842565000: #{#chess_clojure.core.Piece{:name :Q, :pos [3 5]}
> #chess_clojure.core.Piece{:name :B, :pos [0 4]}
> #chess_clojure.core.Piece{:name :R, :pos [1 2]}
> #chess_clojure.core.Piece{:name :N, :pos [8 1]}}"
> "842565000: #{#chess_clojure.core.Piece{:name :Q, :pos [3 4]}
> #chess_clojure.core.Piece{:name :B, :pos [1 5]}
> #chess_clojure.core.Piece{:name :R, :pos [7 2]}
> #chess_clojure.core.Piece{:name :N, :pos [0 0]}}"
> "842565000: #{#chess_clojure.core.Piece{:name :Q, :pos [4 2]}
> #chess_clojure.core.Piece{:name :B, :pos [0 4]}
> #chess_clojure.core.Piece{:name :N, :pos [6 5]}
> #chess_clojure.core.Piece{:name :R, :pos [1 0]}}"
> "842565000: #{#chess_clojure.core.Piece{:name :Q, :pos [4 0]}
> #chess_clojure.core.Piece{:name :R, :pos [0 2]}
> #chess_clojure.core.Piece{:name :N, :pos [6 5]}
> #chess_clojure.core.Piece{:name :B, :pos [1 4]}}"
> "842565000: #{#chess_clojure.core.Piece{:name :Q, :pos [4 2]}
> #chess_clojure.core.Piece{:name :R, :pos [0 0]}
> #chess_clojure.core.Piece{:name :N, :pos [6 5]}
> #chess_clojure.core.Piece{:name :B, :pos [1 4]}}"
> "842565000: #{#chess_clojure.core.Piece{:name :Q, :pos [4 2]}
> #chess_clojure.core.Piece{:name :R, :pos [1 1]}
> #chess_clojure.core.Piece{:name :N, :pos [6 5]}
> #chess_clojure.core.Piece{:name :B, :pos [0 3]}}"
> "842565000: #{#chess_clojure.core.Piece{:name :R, :pos [1 4]}
> #chess_clojure.core.Piece{:name :Q, :pos [3 3]}
> #chess_clojure.core.Piece{:name :N, :pos [6 5]}
> #chess_clojure.core.Piece{:name :B, :pos [2 0]}}"
> "842565000: #{#chess_clojure.core.Piece{:name :Q, :pos [3 4]}
> #chess_clojure.core.Piece{:name :B, :pos [1 0]}
> #chess_clojure.core.Piece{:name :R, :pos [7 2]}
> #chess_clojure.core.Piece{:name :N, :pos [0 5]}}"
> "842565000: #{#chess_clojure.core.Piece{:name :Q, :pos [4 1]}
> #chess_clojure.core.Piece{:name :N, :pos [7 3]}
> #chess_clojure.core.Piece{:name :R, :pos [1 5]}
> #chess_clojure.core.Piece{:name :B, :pos [0 3]}}"
> "842565000: #{#chess_clojure.core.Piece{:name :Q, :pos [4 1]}
> #chess_clojure.core.Piece{:name :R, :pos [1 2]}
> #chess_clojure.core.Piece{:name :N, :pos [7 3]}
> #chess_clojure.core.Piece{:name :B, :pos [2 0]}}"
> "842565000: #{#chess_clojure.core.Piece{:name :Q, :pos [3 4]}
> #chess_clojure.core.Piece{:name :R, :pos [1 1]}
> #chess_clojure.core.Piece{:name :N, :pos [7 3]}
> #chess_clojure.core.Piece{:name :B, :pos [0 3]}}"
> "842565000: #{#chess_clojure.core.Piece{:name :R, :pos [1 4]}
> #chess_clojure.core.Piece{:name :Q, :pos [3 5]}
> #chess_clojure.core.Piece{:name :N, :pos [8 3]}
> #chess_clojure.core.Piece{:name :B, :pos [0 0]}}"
> "842565000: #{#chess_clojure.core.Piece{:name :Q, :pos [3 4]}
> #chess_clojure.core.Piece{:name :B, :pos [0 5]}
> #chess_clojure.core.Piece{:name :N, :pos [7 2]}
> #chess_clojure.core.Piece{:name :R, :pos [1 0]}}"
> "842565000: #{#chess_clojure.core.Piece{:name :Q, :pos [3 5]}
> #chess_clojure.core.Piece{:name :B, :pos [0 4]}
> #chess_clojure.core.Piece{:name :N, :pos [7 2]}
> #chess_clojure.core.Piece{:name :R, :pos [1 0]}}"
> "842565000: #{#chess_clojure.core.Piece{:name :Q, :pos [3 4]}
> #chess_clojure.core.Piece{:name :N, :pos [7 2]}
> #chess_clojure.core.Piece{:name :B, :pos [1 0]}
> #chess_clojure.core.Piece{:name :R, :pos [0 5]}}"
> "842565000: #{#chess_clojure.core.Piece{:name :Q, :pos [3 5]}
> #chess_clojure.core.Piece{:name :N, :pos [7 2]}
> #chess_clojure.core.Piece{:name :B, :pos [1 0]}
> #chess_clojure.core.Piece{:name :R, :pos [0 4]}}"
> "842565000: #{#chess_clojure.core.Piece{:name :Q, :pos [4 1]}
> #chess_clojure.core.Piece{:name :R, :pos [1 3]}
> #chess_clojure.core.Piece{:name :N, :pos [7 2]}
> #chess_clojure.core.Piece{:name :B, :pos [2 0]}}"
> "842565000: #{#chess_clojure.core.Piece{:name :Q, :pos [3 5]}
> #chess_clojure.core.Piece{:name :R, :pos [0 0]}
> #chess_clojure.core.Piece{:name :N, :pos [7 2]}
> #chess_clojure.core.Piece{:name :B, :pos [1 4]}}"
> "842565000: #{#chess_clojure.core.Piece{:name :Q, :pos [3 5]}
> #chess_clojure.core.Piece{:name :R, :pos [1 1]}
> #chess_clojure.core.Piece{:name :N, :pos [7 2]}
> #chess_clojure.core.Piece{:name :B, :pos [0 3]}}"
> "842565000: #{#chess_clojure.core.Piece{:name :Q, :pos [3 4]}
> #chess_clojure.core.Piece{:name :B, :pos [1 5]}
> #chess_clojure.core.Piece{:name :N, :pos [0 2]}
> #chess_clojure.core.Piece{:name :R, :pos [8 1]}}"
>
> --
> paul.butcher->msgCount++
>
> Snetterton, Castle Combe, Cadwell Park...
> Who says I have a one track mind?
>
> http://www.paulbutcher.com/
> LinkedIn: http://www.linkedin.com/in/paulbutcher
> MSN: p...@paulbutcher.com
> AIM: paulrabutcher
> Skype: paulrabutcher
>
>  --
> --
> 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.
>

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