I think it is important to not attempt to pre-optimize and create partial
solutions. I is fairly easy for the compiler to understand *when*
[Symbol.iterator] is invoked and optimize it at that point, same concept as
on the stack replacement. A better question in my book, is there any engine
author who is concerned about the difficulty of implementing such an
optimization.

Having a shared object means much more escape tracking than if the object
was not shared.

Just my 2 cents.

On Mon, Feb 16, 2015 at 8:32 AM, Andreas Rossberg <rossb...@google.com>
wrote:

> On 16 February 2015 at 15:21, Andrea Giammarchi <
> andrea.giammar...@gmail.com> wrote:
>
>> > Shared mutable result objects
>>
>> FWIW to me that could be even be a singleton frozen `{done: false, value:
>> null}` constant during iteration and a new object only once done.
>>
>> Would this work or speed-up anything at all?
>>
>
> Frozen value null? I don't understand. You'd get the actual values from...
> where?
>
> /Andreas
>
>
> On Mon, Feb 16, 2015 at 2:04 PM, Andreas Rossberg <rossb...@google.com>
>> wrote:
>>
>>> On 15 February 2015 at 12:07, Katelyn Gadd <k...@luminance.org> wrote:
>>>
>>>> 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. =[
>>>>
>>>
>>> Engines are still ramping up on ES6 features, and most probably haven't
>>> been able to put much resources into optimisations yet (ES6 is large!). You
>>> can't compare it to old features that have been tuned for a decade and
>>> expect equal performance. This situation is unfortunate but unavoidable.
>>>
>>> Either way, it doesn't justify cutting corners in the semantics in a
>>> naive and premature attempt to optimise (which might even harm more
>>> highl-level optimisations on the long run). Shared mutable result objects
>>> would be a horrible API with footgun potential, especially when you start
>>> to build stream abstractions on top. FWIW, this has been discussed at
>>> length at some of the meetings.
>>>
>>> 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.
>>>>
>>>
>>> Not sure what you mean here. Unfortunately, result objects are still
>>> mutable and extensible, so anything can happen.
>>>
>>> /Andreas
>>>
>>>
>>> On 15 February 2015 at 02:36, Andrea Giammarchi
>>>> <andrea.giammar...@gmail.com> 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 <k...@luminance.org>
>>>> 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
>>>> >> es-discuss@mozilla.org
>>>> >> https://mail.mozilla.org/listinfo/es-discuss
>>>> >
>>>> >
>>>> _______________________________________________
>>>> es-discuss mailing list
>>>> es-discuss@mozilla.org
>>>> https://mail.mozilla.org/listinfo/es-discuss
>>>>
>>>
>>>
>>
>
> _______________________________________________
> es-discuss mailing list
> es-discuss@mozilla.org
> https://mail.mozilla.org/listinfo/es-discuss
>
>
_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to