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/ >