<div dir="ltr">Also on more than one occasion I&#39;ve had to work around issues with entry scaling with even mutable hashtables,  A few 100K entries, they are fine but rapidly grind to a halt.  The Python folks have hash tables nailed, über performance and scaling.</div>
<div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, Feb 14, 2013 at 2:20 PM, James Bergstra <span dir="ltr">&lt;<a href="mailto:james.bergstra@gmail.com" target="_blank">james.bergstra@gmail.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I was actually trying to understand the performance bottlenecks of the<br>
&quot;knucleotide&quot; challenge of the language shootout:<br>
<br>
<a href="http://benchmarksgame.alioth.debian.org/u64/program.php?test=knucleotide&amp;lang=racket&amp;id=4" target="_blank">http://benchmarksgame.alioth.debian.org/u64/program.php?test=knucleotide&amp;lang=racket&amp;id=4</a><br>

<br>
Most of the time seems to be spent in the loop that builds the hash table.<br>
<br>
(Incidentally, in that same loop, I tried replacing the set! key with<br>
a for/fold and that helped on my home computer but not the one at<br>
work. Maybe I had different versions of racket, I&#39;m not sure)<br>
<span class="HOEnZb"><font color="#888888"><br>
- James<br>
</font></span><div class="im HOEnZb"><br>
On Thu, Feb 14, 2013 at 2:15 PM, Robby Findler<br>
&lt;<a href="mailto:robby@eecs.northwestern.edu">robby@eecs.northwestern.edu</a>&gt; wrote:<br>
</div><div class="HOEnZb"><div class="h5">&gt; hash-update is defined in Racket and, besides the error checking, is<br>
&gt; basically the composition of those two functions. I expect it was written as<br>
&gt; something to abstract over a common pattern, not speed things up.<br>
&gt;<br>
&gt; Is this a bottleneck in some real program? Perhaps you&#39;d share that (or some<br>
&gt; inner loop of it)? I wonder if there is a better way to speed it up than<br>
&gt; this.<br>
&gt;<br>
&gt; Robby<br>
&gt;<br>
&gt;<br>
&gt; On Thu, Feb 14, 2013 at 1:09 PM, J. Ian Johnson &lt;<a href="mailto:ianj@ccs.neu.edu">ianj@ccs.neu.edu</a>&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; If I am right, then it would make sense to use hash-update when the hash<br>
&gt;&gt; is big enough that a log-time traversal takes longer than a general<br>
&gt;&gt; procedure call&#39;s set-up and tear-down.<br>
&gt;&gt; -Ian<br>
&gt;&gt; ----- Original Message -----<br>
&gt;&gt; From: James Bergstra &lt;<a href="mailto:james.bergstra@gmail.com">james.bergstra@gmail.com</a>&gt;<br>
&gt;&gt; To: J. Ian Johnson &lt;<a href="mailto:ianj@ccs.neu.edu">ianj@ccs.neu.edu</a>&gt;<br>
&gt;&gt; Cc: <a href="mailto:users@racket-lang.org">users@racket-lang.org</a><br>
&gt;&gt; Sent: Thu, 14 Feb 2013 13:47:51 -0500 (EST)<br>
&gt;&gt; Subject: Re: [racket] Question about hash table efficiency<br>
&gt;&gt;<br>
&gt;&gt; Thanks, I suppose I just had my hopes up. I thought the more compact<br>
&gt;&gt; form might involve fewer expression evaluations and require just one<br>
&gt;&gt; hash lookup instead of two, and therefore might run something like<br>
&gt;&gt; twice as fast, rather than slightly slower.<br>
&gt;&gt;<br>
&gt;&gt; On Thu, Feb 14, 2013 at 1:36 PM, J. Ian Johnson &lt;<a href="mailto:ianj@ccs.neu.edu">ianj@ccs.neu.edu</a>&gt; wrote:<br>
&gt;&gt; &gt; My guess would be the higher-orderness on hash-update causes the (minor)<br>
&gt;&gt; &gt; slowdown.<br>
&gt;&gt; &gt; -Ian<br>
&gt;&gt; &gt; ----- Original Message -----<br>
&gt;&gt; &gt; From: James Bergstra &lt;<a href="mailto:james.bergstra@gmail.com">james.bergstra@gmail.com</a>&gt;<br>
&gt;&gt; &gt; To: <a href="mailto:users@racket-lang.org">users@racket-lang.org</a><br>
&gt;&gt; &gt; Sent: Thu, 14 Feb 2013 13:16:47 -0500 (EST)<br>
&gt;&gt; &gt; Subject: [racket] Question about hash table efficiency<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Hi list, just discovered racket and having fun learning about scheme<br>
&gt;&gt; &gt; again. Haven&#39;t used it since undergrad. Thanks!<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; I was wondering about the efficiency of hash-update vs. hash-set and<br>
&gt;&gt; &gt; hash-ref. I thought the former would be faster, otherwise why have it?<br>
&gt;&gt; &gt; A little benchmark script reveals the same surprising result as my<br>
&gt;&gt; &gt; actual application though:<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; &quot;&quot;&quot;<br>
&gt;&gt; &gt; #lang racket<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; ;; warm-up<br>
&gt;&gt; &gt; (time (void<br>
&gt;&gt; &gt;  (for/fold ([table (make-immutable-hasheq &#39;())])<br>
&gt;&gt; &gt;   ([ii (in-range 100000)])<br>
&gt;&gt; &gt;   (hash-update table (modulo ii 100) add1 ii))))<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; ;; update<br>
&gt;&gt; &gt; (newline)<br>
&gt;&gt; &gt; (time (void<br>
&gt;&gt; &gt;  (for/fold ([table (make-immutable-hasheq &#39;())])<br>
&gt;&gt; &gt;   ([ii (in-range 100000)])<br>
&gt;&gt; &gt;   (hash-update table (modulo ii 100) add1 ii))))<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; ;; set/ref<br>
&gt;&gt; &gt; (newline)<br>
&gt;&gt; &gt; (time (void<br>
&gt;&gt; &gt;  (for/fold ([table (make-immutable-hasheq &#39;())])<br>
&gt;&gt; &gt;   ([ii (in-range 100000)])<br>
&gt;&gt; &gt;   (hash-set table (modulo ii 100) (add1 (hash-ref table (modulo ii 100)<br>
&gt;&gt; &gt; ii))))))<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; &quot;&quot;&quot;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; This prints out:<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; cpu time: 112 real time: 114 gc time: 32<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; cpu time: 80 real time: 82 gc time: 0<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; cpu time: 76 real time: 75 gc time: 4<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; My original application used mutable hash tables and the same effect<br>
&gt;&gt; &gt; was observed (if not more dramatically). Any thoughts on why the<br>
&gt;&gt; &gt; update form is slower? I&#39;m running this in Racket v5.1.1.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; - James<br>
&gt;&gt; &gt; ____________________<br>
&gt;&gt; &gt;   Racket Users list:<br>
&gt;&gt; &gt;   <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
&gt;&gt; &gt;<br>
&gt;&gt;<br>
&gt;&gt; ____________________<br>
&gt;&gt;   Racket Users list:<br>
&gt;&gt;   <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
&gt;<br>
&gt;<br>
____________________<br>
  Racket Users list:<br>
  <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
</div></div></blockquote></div><br></div>