on Tue Sep 06 2016, Chris Eidhof <swift-dev-AT-swift.org> wrote: > Thanks! That explains a lot. > > In my version, performance only is improved by 10%, so I'm not sure if the > tradeoff is worth it: > > In the isolated case of AnyIterator, there's only one method, so the sizeof > is the same (and the performance is worth it). In the case of AnySequence, > it would be a lot more work to write the implementation (and the size would > change a lot). Having two different mechanisms for type erasure seems like > it might confuse things even more.
We'll happily take a litte more implementation complexity in exchange for performance gains. 10% is nothing to sneeze at. > On Mon, Sep 5, 2016 at 9:50 PM, Dmitri Gribenko <griboz...@gmail.com> wrote: > >> On Mon, Sep 5, 2016 at 11:13 AM, Chris Eidhof via swift-dev >> <swift-dev@swift.org> wrote: >> > Hello swift-dev, >> > >> > I was wondering why type erasers (e.g. for AnyIterator) are implemented >> the >> > way they are. I would implement AnyIterator like this: >> > >> > final class MyAnyIterator<A>: IteratorProtocol { >> > var nextImpl: () -> A? >> > >> > init<I: IteratorProtocol>(iterator: I) where I.Element == A { >> > var copy = iterator >> > nextImpl = { copy.next() } >> > } >> > >> > func next() -> A? { >> > return nextImpl() >> > } >> > } >> > >> > Instead, it is implemented in a class which contains a box. >> >> Your approach requires adding a new closure property for every method >> that is forwarded. Subclassing does not require that. >> >> If you see a case where performance is not good, we would appreciate a >> bugreport at https://bugs.swift.org/ . Please attach a self-contained >> reproducer. Thank you. >> >> Dmitri >> >> -- >> main(i,j){for(i=2;;i++){for(j=2;j<i;j++){if(!(i%j)){j=0;break;}}if >> (j){printf("%d\n",i);}}} /*Dmitri Gribenko <griboz...@gmail.com>*/ >> -- -Dave _______________________________________________ swift-dev mailing list swift-dev@swift.org https://lists.swift.org/mailman/listinfo/swift-dev