For my own needs, I wrote a macro 'timings' - see Timing expressions and
comparing results:
https://groups.google.com/d/msg/clojure/o8pOLc6uxQQ/bui7sJ-F5_wJ
Code and examples are here:
https://gist.github.com/fsodomka/5890711
Your examples on my machine with Clojure 1.5.1:
(report
(let [x 2 y [0 1 2 3 4]]
(timings 10000000
(remove #{x} y)
(remove #(= % x) y)
(remove #(== % x) y)
(remove #(.equals % x) y))))
|
:expr | :time | :ratio | :perc |
|----------------------------------------------------------------+---------------+--------+-------|
| (remove (fn* [p1__435#] (== p1__435# x)) y) | 28.164219 | 1.0
| 3.84 |
| (remove (fn* [p1__436#] (.equals p1__436# x)) y) | 28.310134 | 1.01
| 3.86 |
| (remove (fn* [p1__434#] (= p1__434# x)) y) | 29.038815 |
1.03 | 3.96 |
| (remove #{x} y) |
733.326342 | 26.04 | 100.0 |
Using set is 26 times slower than any other way and I would probably pick
== for number comparison.
(report
(let [a (int-array 10)]
(timings 10000000
(aset a 1 2)
(aset-int a 1 2))))
| :expr | :time | :ratio | :perc |
|------------------+-----------+--------+-------|
| (aset a 1 2) | 16.062221 | 1.0 | 4.47 |
| (aset-int a 1 2) | 359.22866 | 22.36 | 100.0 |
aset-int is 22x slower than aset.
I would definitely find some resource on performance useful. On the other
side, things change and many recommendations are not valid anymore:
http://gnuvince.wordpress.com/2009/05/11/clojure-performance-tips/
- destructuring is faster ;-)
- spliting (+ 2 4 5) to (+ 2 (+ 4 5)) isn't needed
- etc.
Performance changes with versions of Clojure.
Libraries to consider:
https://github.com/hugoduncan/criterium
https://github.com/davidsantiago/perforate
Frantisek
On Sunday, July 14, 2013 10:15:04 AM UTC+2, Marc Dzaebel wrote:
>
> I'm often in need of performance comparisons/recommendations about
> different ways to code the same usecases. E.g.
>
> (time(let [x 2 y [0 1 2 3 4]] (dotimes [_ 10000000] (remove *#{x}*y))))
> ;~950 ms
> (time(let [x 2 y [0 1 2 3 4]] (dotimes [_ 10000000] (remove *#(= % x)*y))))
> ;~150 ms
>
> (time(let [a (int-array 10)] (dotimes [_ 10000000] (*aset *a 1
> 2)))) ;~7 ms
> (time(let [a (int-array 10)] (dotimes [_ 10000000] (*aset-int *a 1
> 2)))) ;~430 ms
>
> I'd recommend to gather such information at a central place in a more
> systematic way. So I wonder:
>
> - where to place such information
> (Wiki?)<http://en.wikibooks.org/wiki/Clojure_Programming>
> - whether this information is of use
> - whether you have more recommendations regarding performance or the
> form, advices are presented
>
> *Thanks, Marc*
>
--
--
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/groups/opt_out.