James
> --
> You received this message because you are subscribed to the Google
> Groups "Clojure" group.
> To post to this group, send email to clo...@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+u...@googlegroups.com
> For more options, visit this group at
> http://groups.google.com/group/clojure?hl=en
2011/6/25 Alex Baranosky <alexander...@gmail.com>:
Besides a LinkedHashMap-alike, Clojure could probably use at least
these other map variations:
* WeakHashMap (keys weakly bound)
* Map with weak values (useful for caching)
* ConcurrentHashMap
and possibly combinations of the above. Even Java seems to lack
weak-value maps; you can fudge it though by putting a
WeakReference(val) in in a wrapper layer and using a ReferenceQueue
and a thread that drains the queue every so often to prune dead
Map.Entries from the map.
Note that a map of refs doesn't cut it as a substitute for a
ConcurrentHashMap if keys will be added/removed by multiple threads,
and sticking the entire map in an atom doesn't if you want to support
more concurrency than a plain old Collections.synchronizedMap.
Sticking the entire map in a ref and using commute doesn't quite work,
if two concurrent assoces of the same key should force a retry, and
sticking the entire map in a ref and using alter allows no more
concurrency than synchronizedMap.
We really could use an STM-map that supports normal Clojure map get
semantics, but not assoc or dissoc, and supports alter-key and
remove-key which have to be called in a transaction and act like
commuted assoc and dissoc except that one transaction retries if there
are concurrent attempts to change the *same* key.
Perhaps we should also have a way to simply specify, separately and
combinably, in both stm-map and hash-map, options to make the keys
weak, the values weak, or the seq/keys/vals views use the insertion
order. With both weakable keys and weakable vals you can also throw in
a weak-hash-set which can be used to "intern" or "canonicalize" any
desired immutable objects, without packratting them and eventually
blowing the heap, and is implemented under the hood as a weak-keyed,
weak-valued map of objects to themselves.
--
Protege: What is this seething mass of parentheses?!
Master: Your father's Lisp REPL. This is the language of a true
hacker. Not as clumsy or random as C++; a language for a more
civilized age.
--
Hi Alan,
> ArrayMap isn't very performant for large collections. You might like
> https://github.com/flatland/ordered
in my clojure app, I totally rely on ordered sets. Currently, I use
https://github.com/ninjudd/ordered-set
for which I've implemented transient support which is already
incorporated and released. Looking at your code, it basically looks
identical wrt features, except that your implementation is comletely in
clojure (and includes maps) while ninjudd's implementation is mainly
java.
If you know ninjudd's lib, can you give advice in what use-cases you'd
prefer your own lib? Basically, in my scenario I only conjoin using
`into' but never disjoin, and performance for that is very important.
That's why I've implemented the transient support. But as it turned
out, that didn't improve performance significantly, cause the
calculation of set members is far more expensive than aggregating
them...
Well, in any case, I think I'll simply try it out at the weekend.
Hopefully, I'm able to get some totally non-empirical benchmark results
from my test suite that I can poste here.
Bye,
Tassilo
Hi Alan,
> If I were using this for some performance-critical task and never
> disjoined, I'd use ninjudd's version. Otherwise I'd use mine, just
> because it's easier to build and tweak since it's in clojure.
I tried your implementation, and I couldn't see any relevant slowdown
compared to the java version. So I'll stick with that.
Bye,
Tassilo