<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On Fri, Apr 19, 2013 at 12:58 PM, Sanne Grinovero <span dir="ltr">&lt;<a href="mailto:sanne@infinispan.org" target="_blank">sanne@infinispan.org</a>&gt;</span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="im">On 19 April 2013 10:37, Dan Berindei &lt;<a href="mailto:dan.berindei@gmail.com">dan.berindei@gmail.com</a>&gt; wrote:<br>


&gt; Testing mixed read/write performance with capacity 100000, keys 300000,<br>
&gt; concurrency level 32, threads 12, read:write ratio 99:1<br>
&gt; Container CHM           Ops/s 5178894.77  Gets/s 5127105.82  Puts/s<br>
&gt; 51788.95  HitRatio      86.23  Size     177848  stdDev   60896.42<br>
&gt; Container CHMV8         Ops/s 5768824.37  Gets/s 5711136.13  Puts/s<br>
&gt; 57688.24  HitRatio      84.72  Size     171964  stdDev   60249.99<br>
<br>
</div>Nice, thanks.<br>
<div class="im">&gt;<br>
&gt; The test is probably limited by the 1% writes, but I think it does show that<br>
&gt; reads in CHMV8 are not slower than reads in OpenJDK7&#39;s CHM.<br>
&gt; I haven&#39;t measured it, but the memory footprint should also be better,<br>
&gt; because it doesn&#39;t use segments any more.<br>
&gt;<br>
&gt; AFAIK the memoryCHMV8 also uses copy-on-write at the bucket level, but we<br>
&gt; could definitely do a pure read test with a HashMap to see how big the<br>
&gt; performance difference is.<br>
<br>
</div>By copy-on-write I didn&#39;t mean on the single elements, but on the<br>
whole map instance:<br>
<br>
private volatile HashMap configuration;<br>
<br>
synchronized addConfigurationProperty(String, String) {<br>
     HashMap newcopy = new HashMap( configuration ):<br>
     newcopy.put(..);<br>
     configuration = newcopy;<br>
}<br>
<br>
Of course that is never going to scale for writes, but if writes stop<br>
at runtime after all services are started I would expect that the<br>
simplicity of the non-threadsafe HashMap should have some benefit over<br>
CHM{whatever}, or it would have been removed already?<br>
<span class="HOEnZb"><font color="#888888"><br></font></span></blockquote><div><br></div><div>Right, we should be able to tell whether that&#39;s worth doing with a pure read test with a CHMV8 and a HashMap :)<br></div><div>

 </div><div>But I don&#39;t think that&#39;s going to yield any difference, because all the copy-on-write in CHMV8 adds is a few volatile reads -  and volatile reads are more or less free on x86.<br><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div class="HOEnZb"><div class="h5">
<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; On Fri, Apr 19, 2013 at 11:07 AM, Sanne Grinovero &lt;<a href="mailto:sanne@infinispan.org">sanne@infinispan.org</a>&gt;<br>
&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; Why not. Only doubt I&#39;d have is that other usages of the CHM are - I guess<br>
&gt;&gt; - services registry and similar configuration tools, for which write<br>
&gt;&gt; performance is irrelevant: your test measured puts, are there drawbacks on<br>
&gt;&gt; gets or memory usage?<br>
&gt;&gt;<br>
&gt;&gt; Recently you changed all (most?) CHM creations to use a consistent<br>
&gt;&gt; factory, maybe we could improve on that by actually using a couple of<br>
&gt;&gt; factories which differentiate on the intended usage of the CHM: for example<br>
&gt;&gt; some maps who change very infrequently - mostly during boot or<br>
&gt;&gt; reconfiguration, maybe even topology change - could be better served by a<br>
&gt;&gt; non concurrent structure using copy-on-wrtite.<br>
&gt;&gt;<br>
&gt;&gt; Sanne<br>
&gt;&gt;<br>
&gt;&gt; On 19 Apr 2013 08:48, &quot;Dan Berindei&quot; &lt;<a href="mailto:dan.berindei@gmail.com">dan.berindei@gmail.com</a>&gt; wrote:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; +1 to make CHMv8 the default on JDK6 and JDK7<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; But I&#39;m not convinced we should make it the default for JDK8 - even<br>
&gt;&gt;&gt; though we don&#39;t know exactly what we&#39;re getting with the JDK&#39;s<br>
&gt;&gt;&gt; implementation.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; On Fri, Apr 19, 2013 at 5:39 AM, David M. Lloyd &lt;<a href="mailto:david.lloyd@redhat.com">david.lloyd@redhat.com</a>&gt;<br>
&gt;&gt;&gt; wrote:<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; On 04/18/2013 09:35 PM, Manik Surtani wrote:<br>
&gt;&gt;&gt;&gt; &gt; Guys,<br>
&gt;&gt;&gt;&gt; &gt;<br>
&gt;&gt;&gt;&gt; &gt; Based on some recent micro benchmarks I&#39;ve been doing, I&#39;ve seen:<br>
&gt;&gt;&gt;&gt; &gt;<br>
&gt;&gt;&gt;&gt; &gt; MapStressTest configuration: capacity 100000, test running time 60<br>
&gt;&gt;&gt;&gt; &gt; seconds<br>
&gt;&gt;&gt;&gt; &gt; Testing mixed read/write performance with capacity 100,000, keys<br>
&gt;&gt;&gt;&gt; &gt; 300,000, concurrency level 32, threads 12, read:write ratio 0:1<br>
&gt;&gt;&gt;&gt; &gt; Container CHM           Ops/s 21,165,771.67  Gets/s       0.00  Puts/s<br>
&gt;&gt;&gt;&gt; &gt; 21,165,771.67  HitRatio     100.00  Size    262,682  stdDev 77,540.73<br>
&gt;&gt;&gt;&gt; &gt; Container CHMV8         Ops/s 33,513,807.09  Gets/s       0.00  Puts/s<br>
&gt;&gt;&gt;&gt; &gt; 33,513,807.09  HitRatio     100.00  Size    262,682  stdDev 77,540.73<br>
&gt;&gt;&gt;&gt; &gt;<br>
&gt;&gt;&gt;&gt; &gt; So under high concurrency (12 threads, on my workstation with 12<br>
&gt;&gt;&gt;&gt; &gt; hardware threads - so all threads are always working), we see that<br>
&gt;&gt;&gt;&gt; &gt; Infinispan&#39;s CHMv8 implementation is 50% faster than JDK6&#39;s CHM<br>
&gt;&gt;&gt;&gt; &gt; implementation when doing puts.<br>
&gt;&gt;&gt;&gt; &gt;<br>
&gt;&gt;&gt;&gt; &gt; We use a fair number of CHMs all over Infinispan&#39;s codebase.  By<br>
&gt;&gt;&gt;&gt; &gt; default, these are all JDK-provided CHMs.  But we have the option to switch<br>
&gt;&gt;&gt;&gt; &gt; to our CHMv8 implementation by passing in<br>
&gt;&gt;&gt;&gt; &gt; -Dinfinispan.unsafe.allow_jdk8_chm=true.<br>
&gt;&gt;&gt;&gt; &gt;<br>
&gt;&gt;&gt;&gt; &gt; The question is, should this be the default?  Thoughts, opinions?<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; The JDK&#39;s concurrency code - especially CHM - changes all the time.<br>
&gt;&gt;&gt;&gt; You&#39;d be very well-served, in my opinion, to go with something like<br>
&gt;&gt;&gt;&gt; CHMv8 just because you could be so much more sure that you&#39;ll have more<br>
&gt;&gt;&gt;&gt; consistent (and possibly better, but definitely more consistent)<br>
&gt;&gt;&gt;&gt; performance across all JVMs, instead of being at the mercy of whatever<br>
&gt;&gt;&gt;&gt; particular implementation happens to run on whatever JVM.<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; --<br>
&gt;&gt;&gt;&gt; - DML<br>
&gt;&gt;&gt;&gt; _______________________________________________<br>
&gt;&gt;&gt;&gt; infinispan-dev mailing list<br>
&gt;&gt;&gt;&gt; <a href="mailto:infinispan-dev@lists.jboss.org">infinispan-dev@lists.jboss.org</a><br>
&gt;&gt;&gt;&gt; <a href="https://lists.jboss.org/mailman/listinfo/infinispan-dev" target="_blank">https://lists.jboss.org/mailman/listinfo/infinispan-dev</a><br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; _______________________________________________<br>
&gt;&gt;&gt; infinispan-dev mailing list<br>
&gt;&gt;&gt; <a href="mailto:infinispan-dev@lists.jboss.org">infinispan-dev@lists.jboss.org</a><br>
&gt;&gt;&gt; <a href="https://lists.jboss.org/mailman/listinfo/infinispan-dev" target="_blank">https://lists.jboss.org/mailman/listinfo/infinispan-dev</a><br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; _______________________________________________<br>
&gt;&gt; infinispan-dev mailing list<br>
&gt;&gt; <a href="mailto:infinispan-dev@lists.jboss.org">infinispan-dev@lists.jboss.org</a><br>
&gt;&gt; <a href="https://lists.jboss.org/mailman/listinfo/infinispan-dev" target="_blank">https://lists.jboss.org/mailman/listinfo/infinispan-dev</a><br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; _______________________________________________<br>
&gt; infinispan-dev mailing list<br>
&gt; <a href="mailto:infinispan-dev@lists.jboss.org">infinispan-dev@lists.jboss.org</a><br>
&gt; <a href="https://lists.jboss.org/mailman/listinfo/infinispan-dev" target="_blank">https://lists.jboss.org/mailman/listinfo/infinispan-dev</a><br>
_______________________________________________<br>
infinispan-dev mailing list<br>
<a href="mailto:infinispan-dev@lists.jboss.org">infinispan-dev@lists.jboss.org</a><br>
<a href="https://lists.jboss.org/mailman/listinfo/infinispan-dev" target="_blank">https://lists.jboss.org/mailman/listinfo/infinispan-dev</a><br>
</div></div></blockquote></div><br></div></div>