Hi,

I have this in mind. May be It's even possible to remove JMP.

    FE_RESET op1=<array> op2=<label 2> result=<var>
    OP_DATA op1=<iterator> result=<key>
1: statements...
    FE_FETCH op1=<iterator> op2=<label 1> result=<var>
    OP_DATA result=<key>
2:  FREE <iterator>

Anyway, it's not a big problem implementing this, but eliminating of array
duplication is more important.
We still have to solve more serious problems first.

Thanks. Dmitry.

On Wed, Jan 28, 2015 at 6:22 AM, Xinchen Hui <xinche...@zend.com> wrote:

> Hey:
>
> On Wed, Jan 28, 2015 at 12:55 AM, Dmitry Stogov <dmi...@zend.com> wrote:
> > Hi,
> >
> > I'm working on a PoC, implementing the proposed behavior -
> > https://gist.github.com/dstogov/a311e8b0b2cabee4dab4
> >
> > Only few PHPT tests had to be changed to confirm new behavior and
> actually
> > they started to behave as HHVM.
> > 2 tests are still unfixed XFAILed. Foreach by reference is still need to
> be
> > improved to support different array modifications.
> >
> > The patch makes ~1% improvement on Wordpress-3.6 (saving duplication and
> > destruction of 200 arrays on each request)
>
> I just have got an idea:
>
> Droping use of ZEND_OP_DATA make it possible to generate better
> foreach loop opcodes
>
> previously FE_RESET and FE_FETCH  share one same OP_DATA based on offset.
>
> 0 FE_RESET
> 1 FE_FETCH fail-> 5
> 2 OP_DATA
> 3  ..... statements
> 4 JMP 1
> 5....
>
> without depending on that OP_DATA, we can change this to
>
> 0 FE_RESET
> 1 JMP 3
> 2 ....statements
> 3 FE_FETCH success->2
> 4 ....
>
> that will reduce on JMP in every foreach loop
>
> could you please also try this?
>
> thanks
>
> >
> > Thanks. Dmitry.
> >
> >
> >
> > On Thu, Jan 22, 2015 at 1:38 PM, Benjamin Coutu <ben.co...@zeyos.com>
> wrote:
> >>
> >> Hi Nikita,
> >>
> >> I would suggest using the proposal for the by-value case and sticking
> with
> >> the current behavior for the by-reference case as you suggested.
> Granted, we
> >> then cannot remove the internal pointer all together, but we would just
> use
> >> it for the less common by-reference case as well as for the legacy
> >> reset/next functions, of course. This would still improve most for-each
> >> traversals. At least we then wouldn't have to find a replacement
> solution
> >> for rest/prev/next/end. Moreover we can then move the internal position
> >> pointer out of the hashtable structure into zend_array because it is
> only
> >> used for userland arrays, not other hash tables (such as object
> properties
> >> or internal structures that build upon the hashtable struct).
> >>
> >> Thanks,
> >>
> >> Ben
> >>
> >> ========== Original ==========
> >> From: Nikita Popov <nikita....@gmail.com>
> >> To: Benjamin Coutu <ben.co...@zeyos.com>
> >> Date: Thu, 22 Jan 2015 10:53:19 +0100
> >> Subject: Re: [PHP-DEV] Improvements to for-each implementation
> >>
> >> Doing this was the idea I had in mind as well, i.e. change the semantics
> >> of
> >> foreach to say that it will always work on a copy for by-value iteration
> >> (which ironically avoids having to actually copy it). Note that this
> will
> >> differ from the current behavior in a number of ways. In particular it
> >> means that changes to arrays that were references prior to iteration
> will
> >> not influence the iteration.
> >>
> >> The real question is what we should do in the by-reference case. Given
> >> that
> >> we need to acquire references to elements of the original array we can't
> >> reasonably work with copy-semantics (at least I don't see how). So would
> >> we
> >> just stick with the previous behavior (using the hash position hack) for
> >> that?
> >>
> >> Nikita
> >>
> >>
> >> --
> >> PHP Internals - PHP Runtime Development Mailing List
> >> To unsubscribe, visit: http://www.php.net/unsub.php
> >>
> >
>
>
>
> --
> Xinchen Hui
> @Laruence
> http://www.laruence.com/
>

Reply via email to