What I was hoping was that in the case of a generic sequence, the extracted procedures would be specific to the underlying sequence. For example, the procedures returned from sequence-generate for a vector would be (highly) optimized for vectors. But, I have the advantage of arguing from a point of ignorance.<br>
<br><div class="gmail_quote">On Thu, Sep 10, 2009 at 9:18 AM, Matthew Flatt <span dir="ltr">&lt;<a href="mailto:mflatt@cs.utah.edu">mflatt@cs.utah.edu</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;">
When you use `in-vector&#39;, the expansion of `for&#39; uses `vector-ref&#39; etc.<br>
directly, so those operations can be inlined by the JIT.<br>
<br>
When you use a generic sequence, the expansion of `for&#39; extracts a set<br>
of procedures from the sequence. The compiler can&#39;t tell that the<br>
extracted procedures will sometimes be `vector-ref&#39; etc.<br>
<div><div></div><div class="h5"><br>
At Thu, 10 Sep 2009 09:03:24 -0600, Doug Williams wrote:<br>
&gt; Actually, I&#39;d like to dig into the sequence code (specifically,<br>
&gt; sequence-generate) that should give you the sequencing function dynamically.<br>
&gt; I&#39;m not sure why it isn&#39;t as efficient as anything the for macro can<br>
&gt; generate for vectors.<br>
&gt;<br>
&gt; On Thu, Sep 10, 2009 at 8:47 AM, Jakub Piotr Cłapa &lt;<a href="mailto:jpc-ml@zenburn.net">jpc-ml@zenburn.net</a>&gt;wrote:<br>
&gt;<br>
&gt; &gt; On 09-09-10 16:30, Doug Williams wrote:<br>
&gt; &gt;<br>
&gt; &gt;&gt; It&#39;s interesting that if I use (in-vector ...) in the for/fold<br>
&gt; &gt;&gt; statements, the times for the for/fold version are about the same as for<br>
&gt; &gt;&gt; the (uglier) do version (with vector-refs). [This one probably would<br>
&gt; &gt;&gt; benefit from Matthew&#39;s performance improvements.] Actually using it<br>
&gt; &gt;&gt; would mean giving up the flexibility in going to sequences in the first<br>
&gt; &gt;&gt; place, but it means there is some hope of eventually getting the same<br>
&gt; &gt;&gt; performance for the sequence versions (at least for vectors).<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; using in-vector in the for<br>
&gt; &gt;&gt; cpu time: 266 real time: 265 gc time: 0<br>
&gt; &gt;&gt; cpu time: 250 real time: 250 gc time: 47<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; current science collection routines<br>
&gt; &gt;&gt; cpu time: 250 real time: 249 gc time: 0<br>
&gt; &gt;&gt; cpu time: 218 real time: 218 gc time: 16<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; It would be nice if (for ((x some-vector)) ...) and (for ((x (in-vector<br>
&gt; &gt;&gt; some-vector))) ...) had similar performance. I realize that at expansion<br>
&gt; &gt;&gt; time the latter knows to expect a vector while the former does not and<br>
&gt; &gt;&gt; can generate code accordingly. But, I can dream.<br>
&gt; &gt;&gt;<br>
&gt; &gt;<br>
&gt; &gt; AFAIU you could special case vectors (duplicating the code) if you expect<br>
&gt; &gt; them to be used frequently. Probably a for-like macro expanding into<br>
&gt; &gt; shortcuts for specified fast iterators would be nice to have. Something like<br>
&gt; &gt;<br>
&gt; &gt; (for ([x (in (list vector string) lst)])<br>
&gt; &gt;  x)<br>
&gt; &gt;<br>
&gt; &gt; would expand to<br>
&gt; &gt;<br>
&gt; &gt; (cond<br>
&gt; &gt;  [(list? x) (for ([x (in-list lst)]) x)]<br>
&gt; &gt;  ...<br>
&gt; &gt;  [else (for ([x lst]) x)])<br>
&gt; &gt;<br>
&gt; &gt; PS. And what about generating such special cases by evaling a dynamically<br>
&gt; &gt; generated lambda at runtime? I guess it would make really long iterations<br>
&gt; &gt; faster but the eval overhead would kill the performance for short ones?<br>
&gt; &gt;<br>
&gt; &gt; --<br>
&gt; &gt; regards,<br>
&gt; &gt; Jakub Piotr Cłapa<br>
&gt; &gt;<br>
&gt; &gt; _________________________________________________<br>
&gt; &gt;  For list-related administrative tasks:<br>
&gt; &gt;  <a href="http://list.cs.brown.edu/mailman/listinfo/plt-scheme" target="_blank">http://list.cs.brown.edu/mailman/listinfo/plt-scheme</a><br>
&gt; &gt;<br>
&gt; _________________________________________________<br>
&gt;   For list-related administrative tasks:<br>
&gt;   <a href="http://list.cs.brown.edu/mailman/listinfo/plt-scheme" target="_blank">http://list.cs.brown.edu/mailman/listinfo/plt-scheme</a><br>
</div></div></blockquote></div><br>