<br><br><div class="gmail_quote">On Tue, Dec 15, 2009 at 12:00 PM, Gregory Collins <span dir="ltr">&lt;<a href="mailto:greg@gregorycollins.net">greg@gregorycollins.net</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div class="im">Bulat Ziganshin &lt;<a href="mailto:bulat.ziganshin@gmail.com">bulat.ziganshin@gmail.com</a>&gt; writes:<br>
<br>
&gt; now i see what you mean. no, i mean trivial transformation. #650 says<br>
&gt; about slow GC. why it&#39;s slow? because once you made any update to the<br>
&gt; array, the entire array is marked as updated and scanned on next minor<br>
&gt; GC (which occurs after every 512 kbytes allocated, afaik). let&#39;s<br>
&gt; replace big array (say, of 10,000 elements) with array of 100 arrays<br>
&gt; of 100 elements each. now, between minor GCs only some of arrays will<br>
&gt; be changed and entire amount of memory to be scanned will become less<br>
<br>
</div>I actually tried this, and modified Data.HashTable to use a two-tiered<br>
chunked dynamic array as you suggest. In some limited testing it was<br>
only about 5% faster, so I gave up on it -- you get some GC time back<br>
but you also pay a significant indirection penalty by adding an extra<br>
cache line miss for every operation.<br></blockquote><div><br>This will depend very much on usage patterns and array size. As that array size approaches the size of available memory the difference becomes enormous. Then any single entry mutation forces a linear scan of all of memory. With a two-tier design you only scan a square root of that. I ran benchmarks on a similar hack a year or two ago. Since the difference is asymptotic, you can make it as large of a percentage as you want just by using a bigger hash table/array. I would hazard that your test case wasn&#39;t large enough to see the problem at its worst, or your costs were dominated by other factors than GC.<br>
<br>-Edward Kmett <br></div></div>