Would it negatively impact performance to do a type check? If the input is
a MapEntry, use the current key/val, and then use nth for other cases.
On Wednesday, 4 May 2016 10:52:35 UTC-7, Alex Miller wrote:
>
> Yes, there were some changes relating to tuples in the 1.8 alphas that
> made 2-element vectors valid map entries. However, this was done by having
> IPersistentVector extend IMapEntry which meant that (from a type
> perspective) all vectors were valid map entries. In practice, this led to
> some tricky conditional code both inside and outside Clojure itself to
> account for the separate cases of generic vectors and 2-element vectors
> acting as map entries (this comes up when doing generic tree walk
> traversals on heterogeneous data). This caused some pretty subtle breakage.
> In the end, nearly all of that was backed out prior to release of 1.8. It
> may be considered again in the future - as we found, there are tradeoffs.
>
> Re performance, I think you'll find that key and val are many orders of
> magnitude faster than first and second as they will take a sequence view of
> entry.
>
> By no means rigorous, but a quick test (just reporting last timing):
>
> (def me (first {:a 1}))
>
> (dotimes [_ 20] (time (dotimes [_ 1000000] (key me))))
> "Elapsed time: 0.86 msecs"
>
> (dotimes [_ 20] (time (dotimes [_ 1000000] (val me))))
> "Elapsed time: 0.959 msecs"
>
> (dotimes [_ 20] (time (dotimes [_ 1000000] (first me))))
> "Elapsed time: 52.712 msecs"
>
> (dotimes [_ 20] (time (dotimes [_ 1000000] (second me))))
> "Elapsed time: 56.786 msecs"
>
> If you want something portable between map entries and vectors and also
> fast, I would prefer nth:
>
> (dotimes [_ 20] (time (dotimes [_ 1000000] (nth me 0))))
> "Elapsed time: 0.573 msecs"
>
> (dotimes [_ 20] (time (dotimes [_ 1000000] (nth me 1))))
> "Elapsed time: 0.573 msecs"
>
> (def v [:a 1])
> (dotimes [_ 20] (time (dotimes [_ 1000000] (first v))))
> "Elapsed time: 48.3 msecs"
>
> (dotimes [_ 20] (time (dotimes [_ 1000000] (second v))))
> "Elapsed time: 54.236 msecs"
>
> (dotimes [_ 20] (time (dotimes [_ 1000000] (nth v 0))))
> "Elapsed time: 2.011 msecs"
>
> (dotimes [_ 20] (time (dotimes [_ 1000000] (nth v 1))))
> "Elapsed time: 2.093 msecs"
>
>
> On Wednesday, May 4, 2016 at 11:52:40 AM UTC-5, [email protected]
> <javascript:> wrote:
>>
>> I may be misremembering here, but I think this was briefly implemented
>> for an alpha release of 1.8.0. I think the entire feature in question is
>> being reworked for the future, but I'm uncertain of the details. Perhaps
>> others can chime in with the background motivating those changes and
>> reversions?
>>
>> On Wednesday, May 4, 2016 at 12:44:19 PM UTC-4, JvJ wrote:
>>>
>>>
>>> I've noticed that, in Clojure, there is a MapEntry type that supports
>>> the operations "key" and "val", but in Clojurescript, MapEntry is replaced
>>> by simple 2-element vectors.
>>>
>>> Furthermore, 2-element vectors can be used in almost all other cases
>>> where a MapEntry is expected, and MapEntries support all vector
>>> operations,but "key" and "val" are
>>> not supported on these vectors.
>>>
>>> Is there a particular design reason for this? It doesn't seem like much
>>> more than an inconvenience
>>>
>>
--
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
---
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 [email protected].
For more options, visit https://groups.google.com/d/optout.