I am not sure if this is the root cause of the performance difference you
are seeing, but Clojure records do not cache their hash values:
http://dev.clojure.org/jira/browse/CLJ-1224

I don't know what the default .hashCode method is for deftypes that do not
specify one -- perhaps it is very fast because it is based upon object
identity?

Andy

On Tue, Jun 2, 2015 at 8:28 PM, Mars0i <marsh...@logical.net> wrote:

> Steven--Oops, yeah, I am calling Java methods that are probably using
> hashCode(), and maybe equals().  Interesting.
>
> Is the idea that records are hashed on the values in their fields, while
> deftype object are just hashed a pointer (or whatever identical?
> uses)--something like that?  So if you want fast hashing by raw identity,
> you should not use defrecord?
>
>
>
> On Tuesday, June 2, 2015 at 8:10:04 PM UTC-5, Steven Yi wrote:
>>
>> I'm not aware of anything that would lead to significant differences in
>> regards to the function call.  As a test, I defined an interface and used
>> deftype and defrecord, then used no.disassemble[1] to inspect the results,
>> using the following commands:
>>
>> user=> (use 'no.disassemble)
>>
>> user=> (definterface P (testfn []))
>>
>> user=> (defrecord R1 [x y] P (testfn [this] (reset! x (inc @y)) (reset! y
>> (inc @x))))
>>
>> user=> (deftype R2 [x y] P (testfn [this] (reset! x (inc @y)) (reset! y
>> (inc @x))))
>>
>> user=> (println (disassemble R1))
>>
>> user=> (println (disassemble R2))
>> Looking at the bytecode for the testfn() function for both R1 and R2,
>> they're pretty much identical (same opcodes).
>>
>> My hunch is that your performance issues may lie elsewhere.
>>
>> Just a random guess, are you by chance doing anything with the
>> record/type that would require calling the equals() or hashCode()
>> functions?  defrecord would be doing a bit more work there than deftype,
>> which gets the default equals/hashcode.
>>
>> Hope that helps!
>> steven
>>
>>
>> [1] - https://github.com/gtrak/no.disassemble/
>>
>> On Tuesday, June 2, 2015 at 1:08:13 PM UTC-4, Mars0i wrote:
>>>
>>> I have an application using Java interop, in which I can define a class
>>> using either deftype or defrecord.  It has one field, containing an atom
>>> containing a double, and a few methods.  One of the methods is specified by
>>> an interface defined in Java, and that method is called from Java.  This
>>> method is called many times in an inner loop.  I don't use any of the extra
>>> functionality provided by defrecord, but in otheri, similar programs, I
>>> will.
>>>
>>> When I use defrecord, the speed of the program is about 25% of its speed
>>> when I use deftype.  This is a one-line change.  I'm testing speed simply
>>> by running the program for a long time, and timing it.  I've done this test
>>> repeatedly, so there's no reason to think the differences have to do with
>>> other processes running on my machines.
>>>
>>> When I benchmark simple uses of defrecord and deftype using criterium,
>>> they're about the same speed.
>>>
>>> Is there any obvious reason to think that there are situations--e.g.
>>> method calls from Java--in which deftype would be expected to be
>>> significantly faster than defrecord?
>>>
>>> I can construct a minimal example based on my program and post it here,
>>> but I thought I'd check first whether there is something obvious that I
>>> don't get.
>>>
>>> [The test I did using defrecord is below.  I also replaced 'defrecord'
>>> with 'deftype' and did the same test.  I would think that the JIT compiler
>>> wouldn't be smart enough to optimize away whatever differs between
>>> defrecord and deftype, but maybe I'm wrong about that.
>>>
>>> (defrecord R [x y]
>>>    P
>>>    (incx2y [this] (reset! x (inc @y)))
>>>    (decy2x [this] (reset! y (dec @x))))
>>>
>>> (def r (R. (atom 2) (atom 1)))
>>>
>>> (bench (def _ (dotimes [_ 50000000] (incx2y r) (decy2x r) r)))
>>> ]
>>>
>>>  --
> 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/d/optout.
>

-- 
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/d/optout.

Reply via email to