Last year, I gave a talk at the Conj on my attempt to write an AI for the 
board game Go.  Two things I discovered is that it was hard to get 
predictable performance, but even once I made sure I had all the right type 
hints, there was still a lot of room at the bottom for performance 
improvements.  Towards the end [1], I mentioned a few ideas for 
improvements, one of which was simply using ByteBuffers rather than objects 
to host the data.  This would remove all the levels of indirection, giving 
much better cache coherency, and also allow for fast unsynchronized 
mutability when the situation called for it.

So, ten months and several supporting libraries [2] [3] later, here it 
is: https://github.com/ztellman/vertigo

At a high level, this library is useful whenever your datatype has a fixed 
layout and is used more than once.  Depending on your type, it will give 
you moderate to large memory savings, and if you're willing to forgo some 
of core library in favor of Vertigo's operators, you can get significant 
performance gains on batch operations.  And, in the cases where performance 
doesn't matter, it will behave exactly like any other Clojure data 
structure.

I want to point out that something like this would be more or less 
impossible in Java; reading from an offset in a ByteBuffer without the 
compile-time inference and validation provided by this library would be 
pointlessly risky.  There's not a lot of low-level Clojure libraries, but 
there's an increasing amount of production usage where people are using 
Clojure for performance-sensitive work.  I'm looking forward to seeing what 
people do with Vertigo and libraries like it.

Zach

[1] http://www.youtube.com/watch?feature=player_detailpage&v=v5dYE0CMmHQ#t=1828s
[2] https://github.com/ztellman/primitive-math
[3] https://github.com/ztellman/byte-streams

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