[GIT-PULLS] [php-src] PR #22676: perf: use trunc(dval(&u)) instead of (Long)(dval(&u))
[email protected] (henderkes)
| Newsgroups | php.git-pulls |
|---|---|
| Message-ID | <[email protected]> |
Pull Request: https://github.com/php/php-src/pull/22676
Author: henderkes
… to keep per-digit dependency chain in float register
```php
<?php
// Micro-benchmark of the float->string paths
const N = 4000;
const R = 8;
$vals = [];
for ($i = 1; $i <= N; $i++) {
$vals[] = M_PI * $i / 7.0 + 1.0 / $i;
}
function bench(string $name, callable $fn, array $vals): void {
$fn($vals); $fn($vals);
$best = PHP_INT_MAX;
for ($r = 0; $r < R; $r++) {
$t = hrtime(true);
$sink = $fn($vals);
$dt = hrtime(true) - $t;
if ($dt < $best) $best = $dt;
}
$ops = count($vals);
printf("%-26s %8.1f ns/op (min block %6.2f ms)\n", $name, $best / $ops, $best / 1e6);
}
bench('(string) cast', function($vals){ $s=0; foreach($vals as $v){ $x=(string)$v; $s+=strlen($x); } return $s; }, $vals);
bench('string interpolation', function($vals){ $s=0; foreach($vals as $v){ $x="$v"; $s+=strlen($x); } return $s; }, $vals);
bench('concatenation', function($vals){ $s=''; foreach($vals as $v){ $s = $v . '|'; } return strlen($s); }, $vals);
bench('number_format', function($vals){ $s=0; foreach($vals as $v){ $s+=strlen(number_format($v, 6, '.', ',')); } return $s; }, $vals);
bench("sprintf('%g')", function($vals){ $s=0; foreach($vals as $v){ $s+=strlen(sprintf('%g',$v)); } return $s; }, $vals);
bench("sprintf('%.10f')", function($vals){ $s=0; foreach($vals as $v){ $s+=strlen(sprintf('%.10f',$v)); } return $s; }, $vals);
bench('json_encode (array)', function($vals){ return strlen(json_encode($vals)); }, $vals);
bench('serialize (array)', function($vals){ return strlen(serialize($vals)); }, $vals);
bench('var_export (array)', function($vals){ return strlen(var_export($vals, true)); }, $vals);
bench('implode floats', function($vals){ return strlen(implode(',', $vals)); }, $vals);
```
aarch64:
<table><thead><tr><th>Path (ns/op)</th><th>base</th><th>dtoa</th><th>change</th></tr></thead><tbody><tr><td>(string) cast</td><td>182.6</td><td>146.4</td><td>−19.8%</td></tr><tr><td>string interpolation</td><td>182.8</td><td>146.3</td><td>−20.0%</td></tr><tr><td>concatenation</td><td>196.2</td><td>159.5</td><td>−18.7%</td></tr><tr><td>number_format</td><td>309.8</td><td>286.4</td><td>−7.6%</td></tr><tr><td>sprintf('%g')</td><td>153.0</td><td>137.6</td><td>−10.1%</td></tr><tr><td>sprintf('%.10f')</td><td>258.8</td><td>226.4</td><td>−12.5%</td></tr><tr><td>json_encode (array)</td><td>568.1</td><td>567.8</td><td>−0.1%</td></tr><tr><td>serialize (array)</td><td>580.9</td><td>579.7</td><td>−0.2%</td></tr><tr><td>var_export (array)</td><td>637.5</td><td>635.9</td><td>−0.3%</td></tr><tr><td>implode floats</td><td>164.9</td><td>129.3</td><td>−21.6%</td></tr></tbody></table>
x86_64 (sse4.1):
<table><thead><tr><th>Path (ns/op)</th><th>base</th><th>dtoa</th><th>change</th></tr></thead><tbody><tr><td>(string) cast</td><td>105.9</td><td>100.1</td><td>−5.5%</td></tr><tr><td>string interpolation</td><td>105.6</td><td>100.3</td><td>−5.0%</td></tr><tr><td>concatenation</td><td>111.5</td><td>106.1</td><td>−4.8%</td></tr><tr><td>number_format</td><td>162.4</td><td>158.8</td><td>−2.2%</td></tr><tr><td>sprintf('%g')</td><td>82.2</td><td>79.8</td><td>−2.9%</td></tr><tr><td>sprintf('%.10f')</td><td>136.9</td><td>130.7</td><td>−4.5%</td></tr><tr><td>json_encode (array)</td><td>261.1</td><td>259.7</td><td>−0.5%</td></tr><tr><td>serialize (array)</td><td>268.2</td><td>266.8</td><td>−0.5%</td></tr><tr><td>var_export (array)</td><td>287.5</td><td>290.1</td><td>+0.9%</td></tr><tr><td>implode floats</td><td>103.1</td><td>97.6</td><td>−5.3%</td></tr></tbody></table>