<table cellspacing="0" cellpadding="0" border="0" ><tr><td valign="top" style="font: inherit;">I think that number crunching is so important that it should receive ad hoc optimization, if a more general approach fails. To bring the discussion to a concrete example, I attached a small benchmark to this article.&nbsp; PLT, Bigloo and Gambit take about the same time to run the program below. However, Bigloo and Gambit become ten times faster with a very simple optimization.<br><br>&nbsp;(define-syntax $<br>
&nbsp;&nbsp;&nbsp;&nbsp; (syntax-rules ()<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ( ($ m c i j) (vector-ref m (+fx (*fx c i) j)))<br>
&nbsp;&nbsp;&nbsp;&nbsp; )<br>
&nbsp; )<br>
&nbsp; <br>
&nbsp; (define-syntax $!<br>
&nbsp;&nbsp;&nbsp;&nbsp; (syntax-rules ()<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ( ($! m c i j v) (vector-set! m (+fx (*fx c i) j) v))<br>
&nbsp;&nbsp;&nbsp;&nbsp; )<br>
&nbsp;&nbsp; )<br>
<br>BTW, use the option -Obench to compile Bigloo. When one uses the *fx, +fx, *fl, +fl and /fl in few other places, Bigloo speed is multiplied by 20 (the time is divided by 20). It would be great if PLT had similar directives to control optimization. <br><br>If I missed something, and there is a way to make PLT approach the speed of Bigloo and Gambit in the example below, please let me know.&nbsp; However, I read an article in this list, where you people suggest exactly this, to add unsafe arithmetic operators to improve performance. <br><br><br><br>(module matplt scheme<br>&nbsp;&nbsp; (require (lib "4.ss" "srfi"))<br>&nbsp; <br>&nbsp; (define iii 0)<br><br>&nbsp;(define-syntax $mk<br>&nbsp;&nbsp;&nbsp; (syntax-rules ()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ( ($mk c v) (make-vector c v)) ))<br><br>&nbsp;(define-syntax $<br>&nbsp;&nbsp;&nbsp;&nbsp; (syntax-rules ()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ( ($ m c i j) (vector-ref m (+ (* c i)
 j)))<br>&nbsp;&nbsp;&nbsp;&nbsp; )<br>&nbsp; )<br>&nbsp; <br>&nbsp; (define-syntax $!<br>&nbsp;&nbsp;&nbsp;&nbsp; (syntax-rules ()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ( ($! m c i j v) (vector-set! m (+ (* c i) j) v))<br>&nbsp;&nbsp;&nbsp;&nbsp; )<br>&nbsp;&nbsp; )<br>&nbsp; <br>&nbsp;<br><br><br>(define (prt m r c)<br>&nbsp;&nbsp; (do ( (i 0 (+&nbsp; i 1)) ) ( (&gt;=&nbsp; i r) )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (newline)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (do ((j 0 (+&nbsp; j 1)) )&nbsp; ( (&gt;=&nbsp; j c) )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (printf " %4.3f " ($ m c i j) ) )))<br><br>(define (make-system r)<br>&nbsp; (let* ( (c (+&nbsp; r 1))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (m ($mk (*&nbsp; r c) 0.0 )) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (xx 0.0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (s 0.0) )<br><br>&nbsp;&nbsp;&nbsp; (do ( (i 0 (+&nbsp; i 1))&nbsp; ) (
 (&gt;=&nbsp; i r) m)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (set! s 0.0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (do ((j 0 (+&nbsp; j 1) ) ) ( (&gt;=&nbsp; j r) ($! m c i j&nbsp; s) )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (set! xx (exact-&gt;inexact (random 3873)))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (set! s (+ s xx))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ($! m c i j xx )) )&nbsp; ))<br><br>(define (swapit m c k l)<br>&nbsp; (let ((t 0.0))<br>&nbsp;&nbsp; (set! iii (+&nbsp; iii 1))<br>&nbsp;&nbsp; (do ( (j 0 (+&nbsp; j 1)) ) ( (&gt;=&nbsp; j c) )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (set! t ($ m c k j ) )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ($! m c k j&nbsp; ($ m c l j) )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ($! m c l j t) )&nbsp; )&nbsp; )<br><br>(define (find-max m c k i)<br>&nbsp;&nbsp;&nbsp; (do ( (l (+&nbsp; k 1) (+&nbsp; l 1)) ) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ( (&gt;=&nbsp; l
 (-&nbsp; c 1)) (when (not (= i k))&nbsp; (swapit m&nbsp; c k i )))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (when (&gt; (abs ($ m c l k)) (abs ($ m c i k)) )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (set! i l) )&nbsp; ))<br><br>(define (solvit m r)<br>&nbsp;&nbsp; (let ( (c (+&nbsp; r 1)) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (rat 0.0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (mkk 0.0))<br>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (do ( (k 0 (+&nbsp; k 1)) ) ( (&gt;=&nbsp; k (-&nbsp; r 1)))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (find-max m c k k)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (set! mkk ($ m c&nbsp; k k) ) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (do ( ( i (+&nbsp; k 1)(+&nbsp; i 1)) ) ( (&gt;=&nbsp; i r))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (set! rat
 (/&nbsp; ($ m c i k) mkk&nbsp; ))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (do ( (j&nbsp; k&nbsp; (+&nbsp; j 1))) ( (&gt;=&nbsp; j c) )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ($! m c i j (- ($ m c i j) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (* rat ($ m c k j ) ) ) )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ) <br>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; (do ( (i (-&nbsp; r 1) (-&nbsp; i 1) ) ) ((&lt;&nbsp; i 0) m)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (do ( (j (+&nbsp; i 1) (+&nbsp; j 1))
 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (tx 0.0 (- tx (* ($ m c i j) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ($ m c j r&nbsp;&nbsp;&nbsp; )) )) )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ( (&gt;=&nbsp; j r)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ($! m c i r &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (/ (+ ($ m c&nbsp; i r ) tx)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ($ m c i i)) ) ) ))<br>&nbsp;&nbsp; )<br>)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br>&nbsp;<br>(define (elms argv)<br>&nbsp; (cond (
 (&lt;&nbsp; (length argv) 2) 2000)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ( (string-&gt;number (cadr argv)) (string-&gt;number (cadr argv)) )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (else 2000)))<br><br>(define (main argv)<br>&nbsp;&nbsp; (let* ( (r (elms argv)) (c (+&nbsp; r 1)) (m (solvit (make-system r) r) ) ) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (do ( (i 0 (+&nbsp; i 1))) ( (&gt;=&nbsp; i (min r 10)) )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (display&nbsp; (list($ m c i r)) )&nbsp; ) <br>&nbsp;&nbsp; (newline) <br>&nbsp;&nbsp; (newline) (display iii)) )<br>&nbsp; &nbsp;<br>&nbsp;&nbsp; (time (main '(xx "500")))<br>&nbsp; &nbsp;<br>)<br><br><br></td></tr></table><br>
      <hr size=1>Instant message from any web browser! Try the new <a href="http://ca.messenger.yahoo.com/webmessengerpromo.php"><b> Yahoo! Canada Messenger for the Web BETA</b></a>