On Saturday, May 28, 2016 at 2:38:38 PM UTC-5, Camilo Roca wrote: > > @alex-miller > thanks, that explained a lot. I did check the UseStringDeduplication > feature and that's exactly what I was looking for. > > Funny thing is that it can only be implemented because strings are *immutable > *in Java :P thus it is cheaper to store a reference to it since it will > never change. > > @Tassilo > that's actually a rather interesting example. I always wondered about it > but didn't bother to ask it until now. If you see your example, you can see > that the JVM is actually recognizing the characters inside the vectors are > the same and only allocating one for each occurrence. On the other hand, > the vectors although being exactly the same are not being recognized by the > JVM as so. Thus, two different allocations are done even though only one > would suffice (given their immutability). > > That was precisely my point: If you could identify that something is an > exact copy of something else, why not just point to the first thing? From > Alex miller, answer I know now that this is true for strings and for > primitive values present in the source code. > > But what about keywords? vectors, hash-maps, sets? >
Keywords are interned in Clojure - when you "create" one it will return you the identical instance from the cache if it already exists. There are a few other special cases like this too - things like literal {}, [], (), #{}. But in general this has all the same problems with any cache - synchronization/concurrency, knowing when to clear, updating use stats/refcounting, etc. > Of course, complaining about allocating those in the source code is > non-sense as it would need a huge amount of them to even start to matter. > But if you create lots of them at runtime then it is probably worth to look > at it. > > Say for example a web-server that receives json objects with 70% of its > content being (predefined) configuration values. If you allocate new > strings/vector/hash-map for every request that you get, then your memory > rises quite quickly. On the other hand if you keep a sort of "pool of > values" and replace the new values with references to the ones in the pool > then the total memory consumed is less than before. > I believe there are some json parsers that do exactly this optimization, not too sure about the Clojure ones though. >From my understanding of the description of "UseStringDeduplication" this > is what's been done for Strings, but I guess NOT for any other object. > -- 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.