Compiler Optimizations

  111862
September 15, 2020 13:23 chasepeeler@gmail.com (Chase Peeler)
I brought this up on another thread, but it wasn't addressed (which is
fine, since it was somewhat off-topic). I thought it might be
worth bringing up in its own thread, though.

In the other thread, someone had mentioned the following compiler
optimization

foreach(\array_keys($arr) as $key) {

and quietly transform that into:

foreach ($arr as $key => $_unusedVariableNameThatIsntEvenSpilledToTheScope)
{

I would be more likely to write:
  $keys = array_keys($arr);
  foreach($keys as $key){
Which would prevent me from being able to take advantage of the
optimization.

So, what I was wondering, is if there are other optimizations I might be
missing out on, and if so, are they documented anywhere?


-- 
Chase Peeler
chasepeeler@gmail.com
  111863
September 15, 2020 13:40 benas.molis.iml@gmail.com (Benas IML)
Hey,

During my free time, I'm implementing that specific `array_keys`
optimization. I'm not planning on supporting cases like yours (i. e.
indirection through a variable) since there's no point in doing that. And
also, it's not feasible to support every use case. Should we also support
cases like this?

```php
$a = 'array_keys';
$b = $a(...);
$c = 'b';

foreach ($$c as $key) {
    ...
}
```

Obviously not. `\array_keys` optimization will work the same way as an
optimized `strlen` function works.

That means that the optimization is only going to be applied if the
`array_keys` function is used directly in the `foreach` loop and only if a)
either the namespace is global b) or `\array_keys(...)`/`use function
array_keys` is used.


Best regards,
Benas

On Tue, Sep 15, 2020, 4:23 PM Chase Peeler <chasepeeler@gmail.com> wrote:

> I brought this up on another thread, but it wasn't addressed (which is > fine, since it was somewhat off-topic). I thought it might be > worth bringing up in its own thread, though. > > In the other thread, someone had mentioned the following compiler > optimization > > foreach(\array_keys($arr) as $key) { > > and quietly transform that into: > > foreach ($arr as $key => $_unusedVariableNameThatIsntEvenSpilledToTheScope) > { > > I would be more likely to write: > $keys = array_keys($arr); > foreach($keys as $key){ > Which would prevent me from being able to take advantage of the > optimization. > > So, what I was wondering, is if there are other optimizations I might be > missing out on, and if so, are they documented anywhere? > > > -- > Chase Peeler > chasepeeler@gmail.com >
  111864
September 15, 2020 13:44 chasepeeler@gmail.com (Chase Peeler)
I wasn't proposing that my example be supported. I'm totally okay with the
fact that it doesn't. My question was about whether or not those kinds of
optimizations are documented anywhere so that developers can make sure they
don't miss out on them by not fitting the proper pattern.

On Tue, Sep 15, 2020 at 9:40 AM Benas IML iml@gmail.com> wrote:

> Hey, > > During my free time, I'm implementing that specific `array_keys` > optimization. I'm not planning on supporting cases like yours (i. e. > indirection through a variable) since there's no point in doing that. And > also, it's not feasible to support every use case. Should we also support > cases like this? > > ```php > $a = 'array_keys'; > $b = $a(...); > $c = 'b'; > > foreach ($$c as $key) { > ... > } > ``` > > Obviously not. `\array_keys` optimization will work the same way as an > optimized `strlen` function works. > > That means that the optimization is only going to be applied if the > `array_keys` function is used directly in the `foreach` loop and only if a) > either the namespace is global b) or `\array_keys(...)`/`use function > array_keys` is used. > > > Best regards, > Benas > > On Tue, Sep 15, 2020, 4:23 PM Chase Peeler <chasepeeler@gmail.com> wrote: > >> I brought this up on another thread, but it wasn't addressed (which is >> fine, since it was somewhat off-topic). I thought it might be >> worth bringing up in its own thread, though. >> >> In the other thread, someone had mentioned the following compiler >> optimization >> >> foreach(\array_keys($arr) as $key) { >> >> and quietly transform that into: >> >> foreach ($arr as $key => >> $_unusedVariableNameThatIsntEvenSpilledToTheScope) >> { >> >> I would be more likely to write: >> $keys = array_keys($arr); >> foreach($keys as $key){ >> Which would prevent me from being able to take advantage of the >> optimization. >> >> So, what I was wondering, is if there are other optimizations I might be >> missing out on, and if so, are they documented anywhere? >> >> >> -- >> Chase Peeler >> chasepeeler@gmail.com >> >
-- Chase Peeler chasepeeler@gmail.com
  111865
September 15, 2020 13:50 benas.molis.iml@gmail.com (Benas IML)
Ah, sorry! Misread your post. Anyways, the compiler doesn't transform
`\array_keys()` yet, so there's no optimization for that.

As for other compiler optimizations, 2 that I know that the compiler does
is:

1. Binary OP evaluation i. e. `2 * 2` does not yield `ZEND_ADD` opcode but
is instead computed by the compiler directly.

2. There are special functions that have their own opcodes. You can learn
more about those here:
https://phpinternals.net/articles/optimising_internal_functions_via_new_opcode_instructions

Best regards,
Benas

On Tue, Sep 15, 2020, 4:44 PM Chase Peeler <chasepeeler@gmail.com> wrote:

> I wasn't proposing that my example be supported. I'm totally okay with the > fact that it doesn't. My question was about whether or not those kinds of > optimizations are documented anywhere so that developers can make sure they > don't miss out on them by not fitting the proper pattern. > > On Tue, Sep 15, 2020 at 9:40 AM Benas IML iml@gmail.com> > wrote: > >> Hey, >> >> During my free time, I'm implementing that specific `array_keys` >> optimization. I'm not planning on supporting cases like yours (i. e. >> indirection through a variable) since there's no point in doing that. And >> also, it's not feasible to support every use case. Should we also support >> cases like this? >> >> ```php >> $a = 'array_keys'; >> $b = $a(...); >> $c = 'b'; >> >> foreach ($$c as $key) { >> ... >> } >> ``` >> >> Obviously not. `\array_keys` optimization will work the same way as an >> optimized `strlen` function works. >> >> That means that the optimization is only going to be applied if the >> `array_keys` function is used directly in the `foreach` loop and only if a) >> either the namespace is global b) or `\array_keys(...)`/`use function >> array_keys` is used. >> >> >> Best regards, >> Benas >> >> On Tue, Sep 15, 2020, 4:23 PM Chase Peeler <chasepeeler@gmail.com> wrote: >> >>> I brought this up on another thread, but it wasn't addressed (which is >>> fine, since it was somewhat off-topic). I thought it might be >>> worth bringing up in its own thread, though. >>> >>> In the other thread, someone had mentioned the following compiler >>> optimization >>> >>> foreach(\array_keys($arr) as $key) { >>> >>> and quietly transform that into: >>> >>> foreach ($arr as $key => >>> $_unusedVariableNameThatIsntEvenSpilledToTheScope) >>> { >>> >>> I would be more likely to write: >>> $keys = array_keys($arr); >>> foreach($keys as $key){ >>> Which would prevent me from being able to take advantage of the >>> optimization. >>> >>> So, what I was wondering, is if there are other optimizations I might be >>> missing out on, and if so, are they documented anywhere? >>> >>> >>> -- >>> Chase Peeler >>> chasepeeler@gmail.com >>> >> > > -- > Chase Peeler > chasepeeler@gmail.com >
  111866
September 15, 2020 14:03 chasepeeler@gmail.com (Chase Peeler)
On Tue, Sep 15, 2020 at 9:51 AM Benas IML iml@gmail.com> wrote:

> Ah, sorry! Misread your post. Anyways, the compiler doesn't transform > `\array_keys()` yet, so there's no optimization for that. > > As for other compiler optimizations, 2 that I know that the compiler does > is: > > 1. Binary OP evaluation i. e. `2 * 2` does not yield `ZEND_ADD` opcode but > is instead computed by the compiler directly. > > 2. There are special functions that have their own opcodes. You can learn > more about those here: > > https://phpinternals.net/articles/optimising_internal_functions_via_new_opcode_instructions >
That's a good starting point, thanks.
> > Best regards, > Benas > > On Tue, Sep 15, 2020, 4:44 PM Chase Peeler <chasepeeler@gmail.com> wrote: > >> I wasn't proposing that my example be supported. I'm totally okay with >> the fact that it doesn't. My question was about whether or not those kinds >> of optimizations are documented anywhere so that developers can make sure >> they don't miss out on them by not fitting the proper pattern. >> >> On Tue, Sep 15, 2020 at 9:40 AM Benas IML iml@gmail.com> >> wrote: >> >>> Hey, >>> >>> During my free time, I'm implementing that specific `array_keys` >>> optimization. I'm not planning on supporting cases like yours (i. e. >>> indirection through a variable) since there's no point in doing that. And >>> also, it's not feasible to support every use case. Should we also support >>> cases like this? >>> >>> ```php >>> $a = 'array_keys'; >>> $b = $a(...); >>> $c = 'b'; >>> >>> foreach ($$c as $key) { >>> ... >>> } >>> ``` >>> >>> Obviously not. `\array_keys` optimization will work the same way as an >>> optimized `strlen` function works. >>> >>> That means that the optimization is only going to be applied if the >>> `array_keys` function is used directly in the `foreach` loop and only if a) >>> either the namespace is global b) or `\array_keys(...)`/`use function >>> array_keys` is used. >>> >>> >>> Best regards, >>> Benas >>> >>> On Tue, Sep 15, 2020, 4:23 PM Chase Peeler <chasepeeler@gmail.com> >>> wrote: >>> >>>> I brought this up on another thread, but it wasn't addressed (which is >>>> fine, since it was somewhat off-topic). I thought it might be >>>> worth bringing up in its own thread, though. >>>> >>>> In the other thread, someone had mentioned the following compiler >>>> optimization >>>> >>>> foreach(\array_keys($arr) as $key) { >>>> >>>> and quietly transform that into: >>>> >>>> foreach ($arr as $key => >>>> $_unusedVariableNameThatIsntEvenSpilledToTheScope) >>>> { >>>> >>>> I would be more likely to write: >>>> $keys = array_keys($arr); >>>> foreach($keys as $key){ >>>> Which would prevent me from being able to take advantage of the >>>> optimization. >>>> >>>> So, what I was wondering, is if there are other optimizations I might be >>>> missing out on, and if so, are they documented anywhere? >>>> >>>> >>>> -- >>>> Chase Peeler >>>> chasepeeler@gmail.com >>>> >>> >> >> -- >> Chase Peeler >> chasepeeler@gmail.com >> >
-- Chase Peeler chasepeeler@gmail.com