Hey:

On Wed, Jan 28, 2015 at 11: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?
I mean, dropping both ZEND_FE_RESET and FE_FETCH share one ZEND_OP_DATA.

the previously example should be:

> 0 FE_RESET
> 1 JMP 3
> 2 ....statements
> 3 FE_FETCH success->2
   4 ZEND_OP_DATA
> 5 ....

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



-- 
Xinchen Hui
@Laruence
http://www.laruence.com/

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to