I'm certainly in favor of VMs improving to handle that, and adding pressure for it is good. However, optimizing a TypedArray temporary arg to .set() is a much simpler problem than doing the escape analysis necessary to be certain a .next() result doesn't escape from a calling scope and isn't used after a later next() call. Applying pressure will be a good way to make sure VM authors do the work necessary for this to happen, but if iterators are unacceptably slow in shipping implementations for a year+ I think the odds are good that most shipping software will avoid using them, at which point VM authors will have no reason to optimize for primitives nobody uses. =[
The fixed layout of the iterator object would allow the GC to allocate it cheaply and in the case of values (like ints) it wouldn't need to trace it either - so that helps a lot. But I don't know how realistic those optimizations are in practice. On 15 February 2015 at 02:36, Andrea Giammarchi <[email protected]> wrote: > +1 and I've raised same concerns 2 years ago [1] > > IIRC the outcome was that VM should be good enough to handle objects with > very short lifecycle, I'm still convinced (behind tests) that generators are > overkill for IoT devices (low clock and way lower RAM). > > Having always same object per iteration makes sense to me at least until > it's done so that could be just a struct-like `{done: false, value: null}` > object and GC will be happier than ever. > > Regards > > > [1] > http://webreflection.blogspot.co.uk/2013/06/on-harmony-javascript-generators.html > > On Sun, Feb 15, 2015 at 10:06 AM, Katelyn Gadd <[email protected]> wrote: >> >> As specified, iterator .next() seems to be required to return a new >> object instance for each iteration. >> >> In my testing (and in my theory, as an absolute) this is a real >> performance defect in the spec and it will make iterators inferior to >> all other forms of sequence iteration, to the extent that they may end >> up being used very rarely, and developers will be biased away from Map >> and Set as a result. >> >> The issue here is that the new object requirement means that every >> iteration produces GC pressure. I think that past APIs with this >> problem (for example TypedArray.set) have proven that 'a sufficiently >> smart VM can optimize this' is not representative of real VMs or real >> use cases. >> >> In the specific case of .next(), the method returning a new object on >> every iteration does not produce any actual improvement to usability: >> There is no realistic use case that requires saving multiple next() >> results from the same sequence, as the sequence itself represents (at >> least in most cases) a container or generated value sequence that is >> fully reproducible on demand. >> >> I think allowing (or requiring) implementations to return the same >> object instance from every .next() call, or perhaps as a usability >> compromise, reusing a pair of objects on a round-robin basis (so that >> you can keep around the current and prior result) would be a very good >> decision here. >> >> In my testing Map and Set are outperformed by a trivial Object or >> Array based data structure in every case, *despite the fact* that >> using an Object as a Map requires the use of Object.keys() to be able >> to sequentially iterate elements. The cost of iterator.next() in v8 >> and spidermonkey is currently extremely profound and profiling shows >> all the time is being spent in object creation and GC. (To be fair, >> self-hosting of iterations might improve on this some.) >> >> Oddly enough, I consider the ES iterator spec to be a big improvement >> over C#'s IEnumerable, in terms of usability/API. But this is an area >> where it is intrinsically worse performance-wise than IEnumerable and >> that's unfortunate. >> >> -kg >> _______________________________________________ >> es-discuss mailing list >> [email protected] >> https://mail.mozilla.org/listinfo/es-discuss > > _______________________________________________ es-discuss mailing list [email protected] https://mail.mozilla.org/listinfo/es-discuss

