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