<div dir="ltr">Hm. I&#39;m not sure if the performance difference is a hard limitation because of implementation decisions, or if it would be possible to make the current implementation as fast as the closure-based implementation. I don&#39;t understand enough about the codegen (and about possible optimizations) to make that decision. Anyone who&#39;s willing to help me there?</div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Sep 15, 2016 at 5:01 PM, Dave Abrahams via swift-dev <span dir="ltr">&lt;<a href="mailto:swift-dev@swift.org" target="_blank">swift-dev@swift.org</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class=""><br>
on Tue Sep 06 2016, Chris Eidhof &lt;swift-dev-AT-swift.org&gt; wrote:<br>
<br>
&gt; Thanks! That explains a lot.<br>
&gt;<br>
&gt; In my version, performance only is improved by 10%, so I&#39;m not sure if the<br>
&gt; tradeoff is worth it:<br>
&gt;<br>
&gt; In the isolated case of AnyIterator, there&#39;s only one method, so the sizeof<br>
&gt; is the same (and the performance is worth it). In the case of AnySequence,<br>
&gt; it would be a lot more work to write the implementation (and the size would<br>
&gt; change a lot). Having two different mechanisms for type erasure seems like<br>
&gt; it might confuse things even more.<br>
<br>
</span>We&#39;ll happily take a litte more implementation complexity in exchange<br>
for performance gains.  10% is nothing to sneeze at.<br>
<div><div class="h5"><br>
&gt; On Mon, Sep 5, 2016 at 9:50 PM, Dmitri Gribenko &lt;<a href="mailto:gribozavr@gmail.com">gribozavr@gmail.com</a>&gt; wrote:<br>
&gt;<br>
&gt;&gt; On Mon, Sep 5, 2016 at 11:13 AM, Chris Eidhof via swift-dev<br>
&gt;&gt; &lt;<a href="mailto:swift-dev@swift.org">swift-dev@swift.org</a>&gt; wrote:<br>
&gt;&gt; &gt; Hello swift-dev,<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; I was wondering why type erasers (e.g. for AnyIterator) are implemented<br>
&gt;&gt; the<br>
&gt;&gt; &gt; way they are. I would implement AnyIterator like this:<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; final class MyAnyIterator&lt;A&gt;: IteratorProtocol {<br>
&gt;&gt; &gt;     var nextImpl: () -&gt; A?<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;     init&lt;I: IteratorProtocol&gt;(iterator: I) where I.Element == A {<br>
&gt;&gt; &gt;         var copy = iterator<br>
&gt;&gt; &gt;         nextImpl = { copy.next() }<br>
&gt;&gt; &gt;     }<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;     func next() -&gt; A? {<br>
&gt;&gt; &gt;         return nextImpl()<br>
&gt;&gt; &gt;     }<br>
&gt;&gt; &gt; }<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Instead, it is implemented in a class which contains a box.<br>
&gt;&gt;<br>
&gt;&gt; Your approach requires adding a new closure property for every method<br>
&gt;&gt; that is forwarded.  Subclassing does not require that.<br>
&gt;&gt;<br>
&gt;&gt; If you see a case where performance is not good, we would appreciate a<br>
&gt;&gt; bugreport at <a href="https://bugs.swift.org/" rel="noreferrer" target="_blank">https://bugs.swift.org/</a> .  Please attach a self-contained<br>
&gt;&gt; reproducer.  Thank you.<br>
&gt;&gt;<br>
&gt;&gt; Dmitri<br>
&gt;&gt;<br>
&gt;&gt; --<br>
&gt;&gt; main(i,j){for(i=2;;i++){for(j=<wbr>2;j&lt;i;j++){if(!(i%j)){j=0;<wbr>break;}}if<br>
&gt;&gt; (j){printf(&quot;%d\n&quot;,i);}}} /*Dmitri Gribenko &lt;<a href="mailto:gribozavr@gmail.com">gribozavr@gmail.com</a>&gt;*/<br>
&gt;&gt;<br>
<br>
--<br>
</div></div>-Dave<br>
<br>
______________________________<wbr>_________________<br>
swift-dev mailing list<br>
<a href="mailto:swift-dev@swift.org">swift-dev@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-dev" rel="noreferrer" target="_blank">https://lists.swift.org/<wbr>mailman/listinfo/swift-dev</a><br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature">Chris Eidhof</div>
</div>