I fleshed out some of this a bit more in a blog post with perf numbers in 
case anyone's interested:

http://insideclojure.org/2015/04/27/poly-perf/


On Saturday, April 25, 2015 at 9:39:06 PM UTC-5, Alex Miller wrote:
>
> On Saturday, April 25, 2015 at 9:33:18 AM UTC-5, Timur wrote:
>>
>> Hi everyone,
>>
>> There are situations where I want to dispatch functions using based on 
>> their certain properties. I can also use case statements instead but it 
>> looks more coupled and more change is required if I want to add new types. 
>>
>
> case is useful for the particular situation where you have a finite set of 
> compile-time constants that you are looking for (integers, characters, 
> etc). Then case will leverage a special JVM bytecode that performs a 
> *constant-time* look-up (not linear-time like checking a series of cond 
> conditions, etc). This is one of the two bytecode options (tableswitch, 
> rather than lookupswitch) underlying the Java switch/case feature.
>
> What I want to ask is if I need to avoid using multi-methods for 
>> performance reasons? I read somewhere that they are not really fast but the 
>> posts were old and the performance might have been improved in between. 
>> Should I favor case and cond branches instead of defmulti when I need 
>> performance? 
>>
>
> multimethods are slower than protocols - they must effectively invoke the 
> dispatch function, perform a linear search for a match across the cases, 
> and then invoke the actual implementation function. Protocols leverage JVM 
> internals to select the right implementation, then invoke it. However, the 
> search part of multimethods is cached, making that step fast after the 
> initial call. The last time I benchmarked multimethods with class dispatch 
> vs protocols on Java 1.8 + Clojure 1.7 alphas (can't remember which one), I 
> found multimethods were about 5x slower.
>
> If you want fastest type-based dispatch with open extension, then 
> protocols are the best.
> If you want any other type of dispatch with open extension, then 
> multimethods are the best.
> If you want a closed system of constant choices, then case is best 
> (constant-time lookup!)
> If you want a closed system of arbitrary conditions, then cond is best.
>
> I have never compared the performance of cond vs multimethods for 
> something like this. My guess is that multimethods are faster as they 
> evaluate a single condition, then do a table lookup once cached vs 
> evaluating a series of conditions every time. 
>
> Alex 
>
>

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