Skip to content

Conversation

@ndossche
Copy link
Member

@ndossche ndossche commented Oct 28, 2025

We never need to use refcounted copies for arguments because the copy to
the call frame already increments the refcount.

For the following benchmark:

$a = range(0, 10);
for ($i = 0; $i < 1000000; $i++)
    array_walk($a, fn ($val, $idx, $arg) => $val + $arg, 2);

On an i7-4790:

Benchmark 1: ./sapi/cli/php x.php
  Time (mean ± σ):     593.0 ms ±   5.4 ms    [User: 589.8 ms, System: 1.7 ms]
  Range (min … max):   583.3 ms … 600.9 ms    10 runs

Benchmark 2: ./sapi/cli/php_old x.php
  Time (mean ± σ):     637.8 ms ±   4.6 ms    [User: 633.9 ms, System: 2.2 ms]
  Range (min … max):   633.4 ms … 649.2 ms    10 runs

Summary
  ./sapi/cli/php x.php ran
    1.08 ± 0.01 times faster than ./sapi/cli/php_old x.php

On an i7-1185G7:

Benchmark 1: ./sapi/cli/php x.php
  Time (mean ± σ):     362.3 ms ±   2.0 ms    [User: 359.9 ms, System: 1.9 ms]
  Range (min … max):   359.6 ms … 367.1 ms    10 runs

Benchmark 2: ./sapi/cli/php_old x.php
  Time (mean ± σ):     385.5 ms ±   1.8 ms    [User: 383.2 ms, System: 1.9 ms]
  Range (min … max):   381.5 ms … 387.2 ms    10 runs

Summary
  ./sapi/cli/php x.php ran
    1.06 ± 0.01 times faster than ./sapi/cli/php_old x.php

@ndossche ndossche changed the title [WIP] Improve performance of array_walk() Improve performance of array_walk() Oct 31, 2025
@ndossche ndossche marked this pull request as ready for review October 31, 2025 07:55
@ndossche ndossche requested a review from bukka as a code owner October 31, 2025 07:55
ndossche and others added 3 commits November 4, 2025 21:00
We never need to use refcounted copies for arguments because the copy to
the call frame already increments the refcount.

For the following benchmark:
```php
$a = range(0, 10);
for ($i = 0; $i < 1000000; $i++)
    array_walk($a, fn ($val, $idx, $arg) => $val + $arg, 2);
```

On an i7-4790:
```
Benchmark 1: ./sapi/cli/php x.php
  Time (mean ± σ):     593.0 ms ±   5.4 ms    [User: 589.8 ms, System: 1.7 ms]
  Range (min … max):   583.3 ms … 600.9 ms    10 runs

Benchmark 2: ./sapi/cli/php_old x.php
  Time (mean ± σ):     637.8 ms ±   4.6 ms    [User: 633.9 ms, System: 2.2 ms]
  Range (min … max):   633.4 ms … 649.2 ms    10 runs

Summary
  ./sapi/cli/php x.php ran
    1.08 ± 0.01 times faster than ./sapi/cli/php_old x.php
```

On an i7-1185G7:
```
Benchmark 1: ./sapi/cli/php x.php
  Time (mean ± σ):     362.3 ms ±   2.0 ms    [User: 359.9 ms, System: 1.9 ms]
  Range (min … max):   359.6 ms … 367.1 ms    10 runs

Benchmark 2: ./sapi/cli/php_old x.php
  Time (mean ± σ):     385.5 ms ±   1.8 ms    [User: 383.2 ms, System: 1.9 ms]
  Range (min … max):   381.5 ms … 387.2 ms    10 runs

Summary
  ./sapi/cli/php x.php ran
    1.06 ± 0.01 times faster than ./sapi/cli/php_old x.php
```
@ndossche ndossche merged commit 3f8dc37 into php:master Nov 4, 2025
10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants