<p dir="ltr">I meant that binding a parameter is different from an assign/unassign pair, and that fetching the value involves something more than just dereferencing the value cell.  </p>
<div class="gmail_quote">On Aug 16, 2013 5:42 AM, &quot;Matthew Flatt&quot; &lt;<a href="mailto:mflatt@cs.utah.edu">mflatt@cs.utah.edu</a>&gt; wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
No, not if you mean &quot;deep binding&quot; in the sense of a list that has to<br>
be searched to find a parameter value.<br>
<br>
At Fri, 16 Aug 2013 05:23:52 -0700, Joe Marshall wrote:<br>
&gt; Sounds like Racket is using a &quot;deep binding&quot; strategy rather than &quot;shallow<br>
&gt; binding&quot;.  I expect that SBCL uses shallow.<br>
&gt;  On Aug 16, 2013 5:10 AM, &quot;Matthew Flatt&quot; &lt;<a href="mailto:mflatt@cs.utah.edu">mflatt@cs.utah.edu</a>&gt; wrote:<br>
&gt;<br>
&gt; &gt; At Fri, 16 Aug 2013 13:59:55 +0400, Roman Klochkov wrote:<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; I compared parameterize with lexical var<br>
&gt; &gt; &gt; ----<br>
&gt; &gt; &gt; &gt; (require rackunit)<br>
&gt; &gt; &gt; &gt; (define my-parameter (make-parameter (box 0)))<br>
&gt; &gt; &gt; &gt; (time<br>
&gt; &gt; &gt;    (parameterize ([my-parameter (box 0)])<br>
&gt; &gt; &gt;      (for ([x (in-range 10000000)])<br>
&gt; &gt; &gt;        (set-box! (my-parameter)<br>
&gt; &gt; &gt;                  (add1 (unbox (my-parameter)))))<br>
&gt; &gt; &gt;      (check-equal? (unbox (my-parameter)) 10000000)))<br>
&gt; &gt; &gt; cpu time: 3578 real time: 3610 gc time: 0<br>
&gt; &gt; &gt; &gt; (time<br>
&gt; &gt; &gt;    (let ([my-parameter (box 0)])<br>
&gt; &gt; &gt;      (for ([x (in-range 10000000)])<br>
&gt; &gt; &gt;        (set-box! my-parameter<br>
&gt; &gt; &gt;                  (add1 (unbox my-parameter))))<br>
&gt; &gt; &gt;      (check-equal? (unbox my-parameter) 10000000)))<br>
&gt; &gt; &gt; cpu time: 47 real time: 47 gc time: 0<br>
&gt; &gt; &gt; ----<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; 100 times difference!<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; The same experiment with Common Lisp (SBCL):<br>
&gt; &gt; &gt; ----<br>
&gt; &gt; &gt; CL-USER&gt; (setf *a* (list 0))<br>
&gt; &gt; &gt; (0)<br>
&gt; &gt; &gt; CL-USER&gt; (time (progn (loop :for i :from 0 :below 10000000<br>
&gt; &gt; &gt;             :do (setf (car *a*) (+ 1 (car *a*)))) (= (car *a*)<br>
&gt; &gt; 10000000)))<br>
&gt; &gt; &gt; Evaluation took:<br>
&gt; &gt; &gt;   0.063 seconds of real time<br>
&gt; &gt; &gt;   0.062500 seconds of total run time (0.062500 user, 0.000000 system)<br>
&gt; &gt; &gt;   98.41% CPU<br>
&gt; &gt; &gt;   172,464,541 processor cycles<br>
&gt; &gt; &gt;   0 bytes consed<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; T<br>
&gt; &gt; &gt; CL-USER&gt; (let ((a (list 0))) (time (loop :for i :from 0 :below 10000000<br>
&gt; &gt; &gt;             :do (setf (car a) (+ 1 (car a))))) (= (car a) 10000000))<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; Evaluation took:<br>
&gt; &gt; &gt;   0.047 seconds of real time<br>
&gt; &gt; &gt;   0.046875 seconds of total run time (0.046875 user, 0.000000 system)<br>
&gt; &gt; &gt;   100.00% CPU<br>
&gt; &gt; &gt;   132,098,942 processor cycles<br>
&gt; &gt; &gt;   0 bytes consed<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; T<br>
&gt; &gt; &gt; ----<br>
&gt; &gt; &gt; Only 1.5 times.<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; Is it undesirable to use parameterize as replacement for common lisp<br>
&gt; &gt; special<br>
&gt; &gt; &gt; variables? What is it designed for then?<br>
&gt; &gt;<br>
&gt; &gt; Parameters in Racket are grouped together in a an extra layer called a<br>
&gt; &gt; &quot;parameterization&quot;, which enables capture of the current values of all<br>
&gt; &gt; parameters. For example, when a new thread is created in Racket, then<br>
&gt; &gt; the new inherits all of the current parameter values from the creating<br>
&gt; &gt; thread. A lack of cleverness in that layer is probably the main effect<br>
&gt; &gt; on performance in yuor example.<br>
&gt; &gt;<br>
&gt; &gt; Using a raw, symbol-keyed continuation mark would be closer to a Common<br>
&gt; &gt; Lisp special variable, I think. On my machine:<br>
&gt; &gt;<br>
&gt; &gt;  ;; parameter<br>
&gt; &gt;  &gt; (time<br>
&gt; &gt;     (parameterize ([my-parameter (box 0)])<br>
&gt; &gt;       (for ([x (in-range 10000000)])<br>
&gt; &gt;         (set-box! (my-parameter)<br>
&gt; &gt;                   (add1 (unbox (my-parameter)))))<br>
&gt; &gt;       (check-equal? (unbox (my-parameter)) 10000000)))<br>
&gt; &gt;  cpu time: 2539 real time: 2537 gc time: 0<br>
&gt; &gt;<br>
&gt; &gt;  ;; direct<br>
&gt; &gt;  &gt; (time<br>
&gt; &gt;     (let ([my-parameter (box 0)])<br>
&gt; &gt;       (for ([x (in-range 10000000)])<br>
&gt; &gt;         (set-box! my-parameter<br>
&gt; &gt;                   (add1 (unbox my-parameter))))<br>
&gt; &gt;       (check-equal? (unbox my-parameter) 10000000)))<br>
&gt; &gt;  cpu time: 45 real time: 45 gc time: 0<br>
&gt; &gt;<br>
&gt; &gt;  ;; raw continuation mark:<br>
&gt; &gt;  &gt; (time<br>
&gt; &gt;     (let ([my-parameter<br>
&gt; &gt;            (lambda ()<br>
&gt; &gt;              (continuation-mark-set-first #f &#39;my-parameter))])<br>
&gt; &gt;       (with-continuation-mark<br>
&gt; &gt;         &#39;my-parameter<br>
&gt; &gt;         (box 0)<br>
&gt; &gt;         (begin<br>
&gt; &gt;           (for ([x (in-range 10000000)])<br>
&gt; &gt;             (set-box! (my-parameter)<br>
&gt; &gt;                       (add1 (unbox (my-parameter)))))<br>
&gt; &gt;           (check-equal? (unbox (my-parameter)) 10000000)))))<br>
&gt; &gt;  cpu time: 244 real time: 243 gc time: 0<br>
&gt; &gt;<br>
&gt; &gt; That&#39;s still a fact of 5 difference. I expect that dynamic binding and<br>
&gt; &gt; special variables have played a more prominent role in Common Lisp than<br>
&gt; &gt; parameters or even continuation-mark lookup in Racket, and so it would<br>
&gt; &gt; make sense that more work has been done in the SBCL to make them fast.<br>
&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; &gt;<br>
</blockquote></div>