UserCache vs FrankenPHP zval.h Reference
Compares UserCache\Cache with a benchmark reference cache built on the official FrankenPHP zval.h helpers, both running in the same persistent FrankenPHP worker threads. The reference is not a public native FrankenPHP cache API. Measured at 2026-09-30T07:54:36.579770+00:00.
- PHP fetch batch times are nanoseconds (ns) per fetch; lower is faster.
- Speedup is the reference time divided by the UserCache time, and the throughput ratio is the UserCache throughput divided by the reference throughput. In both, above 1.00x UserCache is faster.
- Every value is the median of randomized matched pairs. A case counts as faster only when its paired bootstrap 95% interval (the small range under each value) excludes 1.00x: then the faster side is green, and amber marks a case the reference wins.
- A/A runs measure the reference against itself; they show how much the numbers move by noise alone.
Measured run — all selected samples validated · mode worker · micro 15 pairs × 2 sessions · A/A 15 pairs · HTTP 5 rounds × 5 s · CPUs 0-3 · FrankenPHP 51e6246e71f3
Related report: UserCache\Cache performance report (APCu and Yac)
- Geomean
- 1.18x faster
- Reference faster
- 0
- Within interval
- 3
- Geomean
- 1.21x faster
- Reference faster
- 0
- Within interval
- 1
- Geomean
- 1.13x faster
- Reference faster
- 0
- Within interval
- 2
- Geomean throughput
- 1.03x higher
- Reference faster
- 1
- Within interval
- 4
- PHP batch time, median
- 1.21x faster
- Geomean throughput
- 1.01x lower
- Reference faster
- 3
- Within interval
- 8
- PHP batch time, median
- 1.16x slower
- Median
- 2.09x smaller
- UserCache empty segment
- 3.73 MiB
- Extra PHP heap in UserCache
- 456 B to 2.25 MiB
Summary
PHP fetch batch rows compare time inside one PHP execution as a speedup; HTTP rows compare end-to-end throughput. Above 1.00x UserCache is faster in both. Counts use the paired bootstrap 95% interval of each case; the geometric mean weighs every case equally.pairing and statistics note
| Cases | Count | UserCache faster | Within interval | Reference faster | Geomean speedup |
|---|---|---|---|---|---|
| PHP fetch batches | 33 | 30 | 3 | 0 | 1.177x |
| Read fetches | 21 | 20 | 1 | 0 | 1.206x |
| Fetch and mutate | 12 | 10 | 2 | 0 | 1.128x |
| HTTP, 100 ops/request (throughput) | 12 | 7 | 4 | 1 | 1.029x |
| HTTP, 1 op/request (throughput) | 12 | 1 | 8 | 3 | 0.986x |
A/A runs (the reference measured against itself) show the noise floor: their medians range from 0.943x to 1.132x. Cases marked † have A/A noise above ±2%, so differences of that size are not meaningful there.
PHP fetch batches, speedup (reference time ÷ UserCache time)
| Payload | 1 key, warm, read | 1 key, warm, read, TTL 3600 | 1 key, warm, mutate | 32,768 keys, warm, read | 32,768 keys, warm, mutate | 32,768 keys, cold, read |
|---|---|---|---|---|---|---|
null | 1.155x1.124–1.180 | - | - | - | - | - |
bool | 1.176x1.164–1.195 | - | - | - | - | - |
int | 1.163x1.145–1.178 | - | - | 1.198x1.189–1.201 | 1.192x1.185–1.197 | 1.420x †1.410–1.446 |
double | 1.157x1.141–1.170 | - | - | - | - | - |
string32 | 1.221x †1.198–1.240 | - | 1.165x1.142–1.190 | - | - | - |
string300 | 1.208x1.187–1.224 | - | 1.192x †1.172–1.196 | 1.296x1.274–1.310 | 1.256x1.234–1.269 | 1.024x1.000–1.057 |
string4k | 1.229x †1.213–1.238 | - | 1.078x1.071–1.098 | - | - | - |
string64k | 1.218x †1.200–1.225 | - | 1.023x0.998–1.045 | - | - | - |
packed8 | 1.271x1.259–1.277 | 1.201x1.191–1.221 | 1.162x1.157–1.172 | 1.305x1.288–1.335 | 1.208x1.194–1.217 | 1.126x1.114–1.150 |
packed512 | 1.270x †1.263–1.286 | - | 1.052x1.049–1.062 | - | - | - |
hash32 | 1.224x1.208–1.234 | - | 1.083x1.069–1.093 | 1.301x †1.225–1.351 | 1.087x †0.991–1.401 | 1.082x †1.047–1.108 |
nested | 1.139x1.122–1.147 | - | 1.069x1.051–1.081 | - | - | - |
HTTP worker scaling, throughput ratio (UserCache ÷ reference)
| Fixture / mix | 1 worker, 100 ops/request | 2 workers, 100 ops/request | 4 workers, 100 ops/request | 1 worker, 1 op/request | 2 workers, 1 op/request | 4 workers, 1 op/request |
|---|---|---|---|---|---|---|
| array / read | 0.998x0.976–1.022 | 0.970x0.870–1.229 | 1.028x1.009–1.036 | 0.976x0.942–0.990 | 1.077x1.032–2.041 | 0.987x0.979–1.014 |
| array / 99% read + 1% store | 0.907x0.767–0.985 | 1.033x0.733–1.261 | 1.141x1.139–1.153 | 0.989x0.932–1.014 | 0.874x0.811–1.267 | 0.993x0.976–1.092 |
| scalar / read | 1.037x1.025–1.089 | 1.025x1.001–1.096 | 1.052x1.041–1.063 | 0.986x0.955–1.015 | 0.996x0.990–0.997 | 0.998x0.985–1.044 |
| scalar / 99% read + 1% store | 1.031x1.021–1.051 | 1.048x0.995–1.173 | 1.100x1.093–1.109 | 0.981x0.946–0.995 | 0.993x0.992–1.009 | 0.998x0.984–1.009 |
PHP fetch batches — worker mode
Median time per fetch in a timed batch, including the common PHP fetch loop and observation or mutation. Seed, setup and warmup stay outside the batch. The speedup cell shows its 95% interval and the speedup of each session; A/A noise is how far the same case measured reference against reference moved from 1.00x.workload note
| Case | UserCache | zval.h reference | Speedup | Faster | A/A noise | Pairs |
|---|---|---|---|---|---|---|
null1 key · warm · read | 62.3 nsCPU 62.3 ns | 72.7 nsCPU 72.7 ns | 1.155x1.124–1.180s1 1.109x · s2 1.170x | UserCache 1.00xzval.h reference 1.16x | ±1.2% | 30 |
bool1 key · warm · read | 58.6 nsCPU 58.4 ns | 68.3 nsCPU 68.3 ns | 1.176x1.164–1.195s1 1.195x · s2 1.173x | UserCache 1.00xzval.h reference 1.18x | ±1.0% | 30 |
int1 key · warm · read | 59.3 nsCPU 59.2 ns | 69.0 nsCPU 69.0 ns | 1.163x1.145–1.178s1 1.160x · s2 1.172x | UserCache 1.00xzval.h reference 1.16x | ±0.1% | 30 |
int32,768 keys · warm · read | 61.4 nsCPU 61.4 ns | 73.8 nsCPU 73.7 ns | 1.198x1.189–1.201s1 1.198x · s2 1.199x | UserCache 1.00xzval.h reference 1.20x | ±1.3% | 30 |
int32,768 keys · warm · mutate flag (scalar no-op) | 61.5 nsCPU 61.5 ns | 73.6 nsCPU 73.6 ns | 1.192x1.185–1.197s1 1.195x · s2 1.190x | UserCache 1.00xzval.h reference 1.19x | ±1.5% | 30 |
int32,768 keys · cold · read | 69.4 nsCPU 69.4 ns | 98.6 nsCPU 98.6 ns | 1.420x †1.410–1.446s1 1.410x · s2 1.444x | UserCache 1.00xzval.h reference 1.42x | ±2.3% | 30 |
double1 key · warm · read | 65.7 nsCPU 65.7 ns | 76.5 nsCPU 76.1 ns | 1.157x1.141–1.170s1 1.155x · s2 1.159x | UserCache 1.00xzval.h reference 1.16x | ±1.7% | 30 |
string321 key · warm · read | 72.9 nsCPU 72.9 ns | 88.1 nsCPU 88.1 ns | 1.221x †1.198–1.240s1 1.230x · s2 1.213x | UserCache 1.00xzval.h reference 1.22x | ±2.9% | 30 |
string321 key · warm · mutate | 83.7 nsCPU 83.6 ns | 97.0 nsCPU 97.0 ns | 1.165x1.142–1.190s1 1.154x · s2 1.191x | UserCache 1.00xzval.h reference 1.16x | ±1.0% | 30 |
string3001 key · warm · read | 68.0 nsCPU 68.0 ns | 81.8 nsCPU 81.8 ns | 1.208x1.187–1.224s1 1.208x · s2 1.202x | UserCache 1.00xzval.h reference 1.21x | ±0.0% | 30 |
string3001 key · warm · mutate | 79.4 nsCPU 79.4 ns | 93.9 nsCPU 93.9 ns | 1.192x †1.172–1.196s1 1.189x · s2 1.193x | UserCache 1.00xzval.h reference 1.19x | ±5.7% | 30 |
string30032,768 keys · warm · read | 69.3 nsCPU 69.2 ns | 89.5 nsCPU 89.4 ns | 1.296x1.274–1.310s1 1.296x · s2 1.301x | UserCache 1.00xzval.h reference 1.30x | ±0.9% | 30 |
string30032,768 keys · warm · mutate | 81.7 nsCPU 81.7 ns | 101.4 nsCPU 101.4 ns | 1.256x1.234–1.269s1 1.245x · s2 1.259x | UserCache 1.00xzval.h reference 1.26x | ±0.7% | 30 |
string30032,768 keys · cold · read | 93.9 nsCPU 93.9 ns | 95.7 nsCPU 95.5 ns | 1.024x1.000–1.057s1 1.061x · s2 1.002x | UserCache 1.00xzval.h reference 1.02xinterval includes 1.00x | ±1.9% | 30 |
string4k1 key · warm · read | 65.6 nsCPU 65.6 ns | 80.6 nsCPU 80.6 ns | 1.229x †1.213–1.238s1 1.227x · s2 1.230x | UserCache 1.00xzval.h reference 1.23x | ±2.5% | 30 |
string4k1 key · warm · mutate | 132.3 nsCPU 132.3 ns | 143.2 nsCPU 143.1 ns | 1.078x1.071–1.098s1 1.072x · s2 1.096x | UserCache 1.00xzval.h reference 1.08x | ±0.4% | 30 |
string64k1 key · warm · read | 65.5 nsCPU 65.5 ns | 80.1 nsCPU 80.1 ns | 1.218x †1.200–1.225s1 1.222x · s2 1.209x | UserCache 1.00xzval.h reference 1.22x | ±2.8% | 30 |
string64k1 key · warm · mutate | 971.7 nsCPU 969.8 ns | 983.5 nsCPU 982.9 ns | 1.023x0.998–1.045s1 1.017x · s2 1.027x | UserCache 1.00xzval.h reference 1.02xinterval includes 1.00x | ±0.1% | 30 |
packed81 key · warm · read | 66.6 nsCPU 66.5 ns | 85.3 nsCPU 85.1 ns | 1.271x1.259–1.277s1 1.279x · s2 1.265x | UserCache 1.00xzval.h reference 1.27x | ±0.5% | 30 |
packed81 key · warm · read · TTL 3600 | 72.2 nsCPU 72.2 ns | 86.9 nsCPU 86.9 ns | 1.201x1.191–1.221s1 1.181x · s2 1.220x | UserCache 1.00xzval.h reference 1.20x | ±0.3% | 30 |
packed81 key · warm · mutate | 94.7 nsCPU 94.7 ns | 110.2 nsCPU 110.2 ns | 1.162x1.157–1.172s1 1.160x · s2 1.164x | UserCache 1.00xzval.h reference 1.16x | ±1.7% | 30 |
packed832,768 keys · warm · read | 73.1 nsCPU 73.0 ns | 95.5 nsCPU 95.5 ns | 1.305x1.288–1.335s1 1.325x · s2 1.291x | UserCache 1.00xzval.h reference 1.30x | ±1.3% | 30 |
packed832,768 keys · warm · mutate | 101.8 nsCPU 101.7 ns | 121.5 nsCPU 121.4 ns | 1.208x1.194–1.217s1 1.210x · s2 1.202x | UserCache 1.00xzval.h reference 1.21x | ±0.3% | 30 |
packed832,768 keys · cold · read | 171.4 nsCPU 171.3 ns | 192.7 nsCPU 192.7 ns | 1.126x1.114–1.150s1 1.156x · s2 1.104x | UserCache 1.00xzval.h reference 1.13x | ±0.5% | 30 |
packed5121 key · warm · read | 66.7 nsCPU 66.6 ns | 85.1 nsCPU 85.0 ns | 1.270x †1.263–1.286s1 1.281x · s2 1.267x | UserCache 1.00xzval.h reference 1.27x | ±2.3% | 30 |
packed5121 key · warm · mutate | 380.7 nsCPU 380.5 ns | 400.7 nsCPU 400.7 ns | 1.052x1.049–1.062s1 1.051x · s2 1.062x | UserCache 1.00xzval.h reference 1.05x | ±0.1% | 30 |
hash321 key · warm · read | 70.1 nsCPU 70.1 ns | 85.7 nsCPU 85.6 ns | 1.224x1.208–1.234s1 1.209x · s2 1.230x | UserCache 1.00xzval.h reference 1.22x | ±0.2% | 30 |
hash321 key · warm · mutate | 149.9 nsCPU 149.8 ns | 162.6 nsCPU 162.5 ns | 1.083x1.069–1.093s1 1.089x · s2 1.076x | UserCache 1.00xzval.h reference 1.08x | ±1.8% | 30 |
hash3232,768 keys · warm · read | 276.1 nsCPU 276.0 ns | 359.4 nsCPU 359.3 ns | 1.301x †1.225–1.351s1 1.280x · s2 1.301x | UserCache 1.00xzval.h reference 1.30x | ±13.2% | 30 |
hash3232,768 keys · warm · mutate | 354.1 nsCPU 354.1 ns | 388.0 nsCPU 383.5 ns | 1.087x †0.991–1.401s1 1.373x · s2 1.013x | UserCache 1.00xzval.h reference 1.09xinterval includes 1.00x | ±7.2% | 30 |
hash3232,768 keys · cold · read | 726.4 nsCPU 725.3 ns | 780.3 nsCPU 779.2 ns | 1.082x †1.047–1.108s1 1.062x · s2 1.085x | UserCache 1.00xzval.h reference 1.08x | ±5.7% | 30 |
nested1 key · warm · read | 73.6 nsCPU 73.6 ns | 83.6 nsCPU 83.4 ns | 1.139x1.122–1.147s1 1.122x · s2 1.147x | UserCache 1.00xzval.h reference 1.14x | ±0.4% | 30 |
nested1 key · warm · mutate | 128.2 nsCPU 128.2 ns | 136.4 nsCPU 136.2 ns | 1.069x1.051–1.081s1 1.075x · s2 1.058x | UserCache 1.00xzval.h reference 1.07x | ±0.3% | 30 |
HTTP worker scaling
Real HTTP requests to FrankenPHP workers. Throughput ratio is the UserCache throughput divided by the reference throughput; above 1.00x UserCache is faster. Closed-loop clients equal twice the worker count, with all workers warmed before timing. The array fixture has TTL 3600; the scalar fixture has TTL 0. Both share 32 keys.HTTP scope note
Throughput
| Case | UserCache | zval.h reference | Throughput ratio | Faster | Rounds |
|---|---|---|---|---|---|
| array / read1 worker · 100 ops/request · TTL 3600 | 17,209 req/s1,720,903 ops/sp50 106.7 µs · p99 254.4 µs | 17,083 req/s1,708,260 ops/sp50 107.5 µs · p99 229.2 µs | 0.998x0.976–1.022 | zval.h reference 1.00xUserCache 1.00xinterval includes 1.00x | 5 |
| array / read2 workers · 100 ops/request · TTL 3600 | 29,064 req/s2,906,447 ops/sp50 113.9 µs · p99 456.0 µs | 29,349 req/s2,934,864 ops/sp50 114.1 µs · p99 428.2 µs | 0.970x0.870–1.229 | zval.h reference 1.00xUserCache 1.03xinterval includes 1.00x | 5 |
| array / read4 workers · 100 ops/request · TTL 3600 | 46,134 req/s4,613,394 ops/sp50 157.3 µs · p99 437.2 µs | 44,873 req/s4,487,288 ops/sp50 162.4 µs · p99 444.9 µs | 1.028x1.009–1.036 | UserCache 1.00xzval.h reference 1.03x | 5 |
| array / 99% read + 1% store1 worker · 100 ops/request · TTL 3600 | 15,071 req/s1,507,129 ops/sp50 115.0 µs · p99 462.5 µs | 16,612 req/s1,661,225 ops/sp50 108.9 µs · p99 276.7 µs | 0.907x0.767–0.985 | zval.h reference 1.00xUserCache 1.10x | 5 |
| array / 99% read + 1% store2 workers · 100 ops/request · TTL 3600 | 32,857 req/s3,285,724 ops/sp50 102.9 µs · p99 376.7 µs | 31,201 req/s3,120,100 ops/sp50 108.1 µs · p99 399.3 µs | 1.033x0.733–1.261 | UserCache 1.00xzval.h reference 1.03xinterval includes 1.00x | 5 |
| array / 99% read + 1% store4 workers · 100 ops/request · TTL 3600 | 42,735 req/s4,273,521 ops/sp50 170.0 µs · p99 475.0 µs | 37,442 req/s3,744,166 ops/sp50 194.8 µs · p99 531.4 µs | 1.141x1.139–1.153 | UserCache 1.00xzval.h reference 1.14x | 5 |
| scalar / read1 worker · 100 ops/request · TTL 0 | 22,474 req/s2,247,421 ops/sp50 79.0 µs · p99 169.6 µs | 21,673 req/s2,167,281 ops/sp50 85.5 µs · p99 165.5 µs | 1.037x1.025–1.089 | UserCache 1.00xzval.h reference 1.04x | 5 |
| scalar / read2 workers · 100 ops/request · TTL 0 | 45,020 req/s4,502,042 ops/sp50 72.3 µs · p99 300.1 µs | 44,595 req/s4,459,480 ops/sp50 74.2 µs · p99 289.8 µs | 1.025x1.001–1.096 | UserCache 1.00xzval.h reference 1.02x | 5 |
| scalar / read4 workers · 100 ops/request · TTL 0 | 56,015 req/s5,601,461 ops/sp50 126.5 µs · p99 390.2 µs | 53,251 req/s5,325,103 ops/sp50 134.0 µs · p99 407.6 µs | 1.052x1.041–1.063 | UserCache 1.00xzval.h reference 1.05x | 5 |
| scalar / 99% read + 1% store1 worker · 100 ops/request · TTL 0 | 21,342 req/s2,134,154 ops/sp50 85.7 µs · p99 175.2 µs | 20,679 req/s2,067,873 ops/sp50 88.5 µs · p99 172.0 µs | 1.031x1.021–1.051 | UserCache 1.00xzval.h reference 1.03x | 5 |
| scalar / 99% read + 1% store2 workers · 100 ops/request · TTL 0 | 42,135 req/s4,213,497 ops/sp50 75.5 µs · p99 393.3 µs | 39,682 req/s3,968,182 ops/sp50 81.0 µs · p99 408.7 µs | 1.048x0.995–1.173 | UserCache 1.00xzval.h reference 1.05xinterval includes 1.00x | 5 |
| scalar / 99% read + 1% store4 workers · 100 ops/request · TTL 0 | 54,166 req/s5,416,551 ops/sp50 131.0 µs · p99 404.4 µs | 49,224 req/s4,922,413 ops/sp50 145.8 µs · p99 420.5 µs | 1.100x1.093–1.109 | UserCache 1.00xzval.h reference 1.10x | 5 |
| array / read1 worker · 1 op/request · TTL 3600 | 26,696 req/s26,696 ops/sp50 64.6 µs · p99 177.0 µs | 27,158 req/s27,158 ops/sp50 61.0 µs · p99 186.2 µs | 0.976x0.942–0.990 | zval.h reference 1.00xUserCache 1.02x | 5 |
| array / read2 workers · 1 op/request · TTL 3600 | 47,976 req/s47,976 ops/sp50 65.9 µs · p99 316.5 µs | 41,528 req/s41,528 ops/sp50 70.7 µs · p99 448.0 µs | 1.077x1.032–2.041 | UserCache 1.00xzval.h reference 1.08x | 5 |
| array / read4 workers · 1 op/request · TTL 3600 | 62,497 req/s62,497 ops/sp50 111.4 µs · p99 375.4 µs | 63,248 req/s63,248 ops/sp50 110.4 µs · p99 365.6 µs | 0.987x0.979–1.014 | zval.h reference 1.00xUserCache 1.01xinterval includes 1.00x | 5 |
| array / 99% read + 1% store1 worker · 1 op/request · TTL 3600 | 26,383 req/s26,383 ops/sp50 66.6 µs · p99 185.3 µs | 27,049 req/s27,049 ops/sp50 63.5 µs · p99 172.3 µs | 0.989x0.932–1.014 | zval.h reference 1.00xUserCache 1.01xinterval includes 1.00x | 5 |
| array / 99% read + 1% store2 workers · 1 op/request · TTL 3600 | 42,893 req/s42,893 ops/sp50 72.9 µs · p99 374.0 µs | 46,648 req/s46,648 ops/sp50 65.5 µs · p99 342.9 µs | 0.874x0.811–1.267 | zval.h reference 1.00xUserCache 1.14xinterval includes 1.00x | 5 |
| array / 99% read + 1% store4 workers · 1 op/request · TTL 3600 | 62,344 req/s62,344 ops/sp50 112.2 µs · p99 366.7 µs | 63,193 req/s63,193 ops/sp50 110.8 µs · p99 364.1 µs | 0.993x0.976–1.092 | zval.h reference 1.00xUserCache 1.01xinterval includes 1.00x | 5 |
| scalar / read1 worker · 1 op/request · TTL 0 | 27,954 req/s27,954 ops/sp50 59.5 µs · p99 143.9 µs | 28,342 req/s28,342 ops/sp50 57.6 µs · p99 139.8 µs | 0.986x0.955–1.015 | zval.h reference 1.00xUserCache 1.01xinterval includes 1.00x | 5 |
| scalar / read2 workers · 1 op/request · TTL 0 | 52,138 req/s52,138 ops/sp50 61.5 µs · p99 258.8 µs | 52,311 req/s52,311 ops/sp50 60.9 µs · p99 255.0 µs | 0.996x0.990–0.997 | zval.h reference 1.00xUserCache 1.00x | 5 |
| scalar / read4 workers · 1 op/request · TTL 0 | 61,113 req/s61,113 ops/sp50 113.0 µs · p99 391.4 µs | 61,366 req/s61,366 ops/sp50 113.4 µs · p99 382.4 µs | 0.998x0.985–1.044 | zval.h reference 1.00xUserCache 1.00xinterval includes 1.00x | 5 |
| scalar / 99% read + 1% store1 worker · 1 op/request · TTL 0 | 27,318 req/s27,318 ops/sp50 58.9 µs · p99 145.6 µs | 28,196 req/s28,196 ops/sp50 57.8 µs · p99 143.2 µs | 0.981x0.946–0.995 | zval.h reference 1.00xUserCache 1.02x | 5 |
| scalar / 99% read + 1% store2 workers · 1 op/request · TTL 0 | 51,849 req/s51,849 ops/sp50 61.9 µs · p99 263.0 µs | 51,856 req/s51,856 ops/sp50 61.7 µs · p99 259.3 µs | 0.993x0.992–1.009 | zval.h reference 1.00xUserCache 1.01xinterval includes 1.00x | 5 |
| scalar / 99% read + 1% store4 workers · 1 op/request · TTL 0 | 62,443 req/s62,443 ops/sp50 111.6 µs · p99 370.8 µs | 62,594 req/s62,594 ops/sp50 110.6 µs · p99 366.7 µs | 0.998x0.984–1.009 | zval.h reference 1.00xUserCache 1.00xinterval includes 1.00x | 5 |
Time inside PHP
Median PHP batch time per cache operation within each request, with the PHP thread CPU per operation for the whole request. Speedup is the reference median divided by the UserCache median. These medians have no paired interval, so they are not colored; the lower median is in green text. With one operation per request, each batch is the first fetch of its request and includes per-request setup, and the cache call is a small part of the request (compare the thread CPU with the HTTP latency above), so throughput mostly reflects HTTP and client overhead.
| Case | UserCache | zval.h reference | Speedup of medians |
|---|---|---|---|
| array / read1 worker · 100 ops/request · TTL 3600 | 176.7 ns/opPHP thread CPU 179.1 ns/op | 176.0 ns/opPHP thread CPU 178.8 ns/op | 0.996x |
| array / read2 workers · 100 ops/request · TTL 3600 | 227.0 ns/opPHP thread CPU 225.2 ns/op | 235.6 ns/opPHP thread CPU 232.9 ns/op | 1.038x |
| array / read4 workers · 100 ops/request · TTL 3600 | 180.9 ns/opPHP thread CPU 184.5 ns/op | 203.8 ns/opPHP thread CPU 207.3 ns/op | 1.127x |
| array / 99% read + 1% store1 worker · 100 ops/request · TTL 3600 | 215.6 ns/opPHP thread CPU 216.3 ns/op | 191.0 ns/opPHP thread CPU 193.7 ns/op | 0.886x |
| array / 99% read + 1% store2 workers · 100 ops/request · TTL 3600 | 222.3 ns/opPHP thread CPU 219.1 ns/op | 251.6 ns/opPHP thread CPU 237.5 ns/op | 1.132x |
| array / 99% read + 1% store4 workers · 100 ops/request · TTL 3600 | 239.0 ns/opPHP thread CPU 232.9 ns/op | 364.0 ns/opPHP thread CPU 269.3 ns/op | 1.523x |
| scalar / read1 worker · 100 ops/request · TTL 0 | 58.8 ns/opPHP thread CPU 62.0 ns/op | 74.6 ns/opPHP thread CPU 77.7 ns/op | 1.267x |
| scalar / read2 workers · 100 ops/request · TTL 0 | 61.4 ns/opPHP thread CPU 64.3 ns/op | 85.5 ns/opPHP thread CPU 88.0 ns/op | 1.393x |
| scalar / read4 workers · 100 ops/request · TTL 0 | 61.1 ns/opPHP thread CPU 64.9 ns/op | 93.8 ns/opPHP thread CPU 97.6 ns/op | 1.536x |
| scalar / 99% read + 1% store1 worker · 100 ops/request · TTL 0 | 72.3 ns/opPHP thread CPU 75.4 ns/op | 83.2 ns/opPHP thread CPU 86.6 ns/op | 1.151x |
| scalar / 99% read + 1% store2 workers · 100 ops/request · TTL 0 | 78.4 ns/opPHP thread CPU 80.5 ns/op | 109.3 ns/opPHP thread CPU 106.8 ns/op | 1.394x |
| scalar / 99% read + 1% store4 workers · 100 ops/request · TTL 0 | 77.1 ns/opPHP thread CPU 80.8 ns/op | 146.4 ns/opPHP thread CPU 120.2 ns/op | 1.899x |
| array / read1 worker · 1 op/request · TTL 3600 | 477.5 ns/opPHP thread CPU 831.0 ns/op | 423.6 ns/opPHP thread CPU 772.8 ns/op | 0.887x |
| array / read2 workers · 1 op/request · TTL 3600 | 524.5 ns/opPHP thread CPU 930.2 ns/op | 640.2 ns/opPHP thread CPU 1,087.3 ns/op | 1.221x |
| array / read4 workers · 1 op/request · TTL 3600 | 528.7 ns/opPHP thread CPU 971.5 ns/op | 522.7 ns/opPHP thread CPU 962.5 ns/op | 0.989x |
| array / 99% read + 1% store1 worker · 1 op/request · TTL 3600 | 547.2 ns/opPHP thread CPU 895.2 ns/op | 467.1 ns/opPHP thread CPU 803.3 ns/op | 0.854x |
| array / 99% read + 1% store2 workers · 1 op/request · TTL 3600 | 714.4 ns/opPHP thread CPU 1,145.7 ns/op | 593.1 ns/opPHP thread CPU 994.6 ns/op | 0.830x |
| array / 99% read + 1% store4 workers · 1 op/request · TTL 3600 | 635.5 ns/opPHP thread CPU 1,063.5 ns/op | 575.7 ns/opPHP thread CPU 1,007.7 ns/op | 0.906x |
| scalar / read1 worker · 1 op/request · TTL 0 | 270.0 ns/opPHP thread CPU 611.1 ns/op | 218.3 ns/opPHP thread CPU 551.2 ns/op | 0.809x |
| scalar / read2 workers · 1 op/request · TTL 0 | 269.2 ns/opPHP thread CPU 642.8 ns/op | 234.5 ns/opPHP thread CPU 604.2 ns/op | 0.871x |
| scalar / read4 workers · 1 op/request · TTL 0 | 319.3 ns/opPHP thread CPU 749.2 ns/op | 282.1 ns/opPHP thread CPU 708.2 ns/op | 0.883x |
| scalar / 99% read + 1% store1 worker · 1 op/request · TTL 0 | 302.5 ns/opPHP thread CPU 628.6 ns/op | 229.3 ns/opPHP thread CPU 564.2 ns/op | 0.758x |
| scalar / 99% read + 1% store2 workers · 1 op/request · TTL 0 | 337.5 ns/opPHP thread CPU 703.7 ns/op | 265.0 ns/opPHP thread CPU 634.8 ns/op | 0.785x |
| scalar / 99% read + 1% store4 workers · 1 op/request · TTL 0 | 398.6 ns/opPHP thread CPU 826.8 ns/op | 303.9 ns/opPHP thread CPU 731.4 ns/op | 0.762x |
Memory usage
The supplied micro host configures UserCache SHM capacity at 256 MiB, entries_hint at 65,536 and PHP memory_limit at 768 MiB. The HTTP host configures SHM at 32 MiB and memory_limit at 256 MiB, leaving entries_hint at the extension default. These are configured capacities/limits, separate from the measured used-byte snapshots below; neither is process RSS.
cached data: for UserCache, shared memory used above the empty segment (the empty segment already holds the entry tables sized by entries_hint; the reference sample of the same host shows it), including keys and allocator overhead; for the reference, requested persistent helper allocations, excluding allocator rounding and some wrapper metadata. PHP heap: sampled worker PHP heap after the reads, above the heap after reset, including warm prototypes and bookkeeping such as UserCache per-key records. PHP peak: peak heap above the heap after reset. Fetched values are released each iteration. These categories cannot be added as if they described equal allocations. The smaller value of each category is highlighted, including ties.
PHP fetch batch data sets
| Data set | UserCache | zval.h reference |
|---|---|---|
null1 key | cached data 32 BPHP heap 3.0 KiBPHP peak 3.0 KiB | cached data 392 BPHP heap 2.6 KiBPHP peak 2.6 KiB |
bool1 key | cached data 32 BPHP heap 3.0 KiBPHP peak 3.0 KiB | cached data 392 BPHP heap 2.6 KiBPHP peak 2.6 KiB |
int1 key | cached data 32 BPHP heap 3.0 KiBPHP peak 3.0 KiB | cached data 392 BPHP heap 2.6 KiBPHP peak 2.6 KiB |
int32,768 keys | cached data 1.00 MiBPHP heap 6.01 MiBPHP peak 6.01 MiB | cached data 3.50 MiBPHP heap 3.76 MiBPHP peak 4.00 MiB |
double1 key | cached data 32 BPHP heap 3.0 KiBPHP peak 3.0 KiB | cached data 392 BPHP heap 2.6 KiBPHP peak 2.6 KiB |
string321 key | cached data 64 BPHP heap 3.1 KiBPHP peak 3.1 KiB | cached data 456 BPHP heap 2.7 KiBPHP peak 2.7 KiB |
string3001 key | cached data 328 BPHP heap 3.4 KiBPHP peak 3.4 KiB | cached data 720 BPHP heap 3.0 KiBPHP peak 3.0 KiB |
string30032,768 keys | cached data 10.50 MiBPHP heap 6.01 MiBPHP peak 6.01 MiB | cached data 13.75 MiBPHP heap 3.76 MiBPHP peak 4.00 MiB |
string4k1 key | cached data 4.1 KiBPHP heap 19.0 KiBPHP peak 19.0 KiB | cached data 4.4 KiBPHP heap 18.6 KiBPHP peak 18.6 KiB |
string64k1 key | cached data 65.0 KiBPHP heap 139.0 KiBPHP peak 139.0 KiB | cached data 64.4 KiBPHP heap 138.6 KiBPHP peak 138.6 KiB |
packed81 key | cached data 264 BPHP heap 3.4 KiBPHP peak 3.4 KiB | cached data 712 BPHP heap 3.0 KiBPHP peak 3.0 KiB |
packed832,768 keys | cached data 8.25 MiBPHP heap 12.76 MiBPHP peak 12.76 MiB | cached data 13.50 MiBPHP heap 10.51 MiBPHP peak 10.51 MiB |
packed5121 key | cached data 8.2 KiBPHP heap 27.1 KiBPHP peak 27.1 KiB | cached data 16.4 KiBPHP heap 26.7 KiBPHP peak 26.7 KiB |
hash321 key | cached data 2.6 KiBPHP heap 8.1 KiBPHP peak 8.7 KiB | cached data 2.9 KiBPHP heap 7.7 KiBPHP peak 7.7 KiB |
hash3232,768 keys | cached data 84.00 MiBPHP heap 87.76 MiBPHP peak 87.76 MiB | cached data 85.25 MiBPHP heap 85.51 MiBPHP peak 85.51 MiB |
nested1 key | cached data 2.3 KiBPHP heap 10.4 KiBPHP peak 10.6 KiB | cached data 4.1 KiBPHP heap 9.9 KiBPHP peak 9.9 KiB |
HTTP fixtures at the end of each case
HTTP end status samples one worker PHP heap; it is not total heap across all workers or process RSS. Shared/persistent stores are process-wide.
| Fixture | UserCache | zval.h reference |
|---|---|---|
| array32 keys · median of 12 cases | cached data 28.2 KiBworker PHP heap 521.6 KiB | cached data 35.5 KiBworker PHP heap 515.7 KiB |
| scalar32 keys · median of 12 cases | cached data 1.0 KiBworker PHP heap 481.7 KiB | cached data 3.2 KiBworker PHP heap 478.8 KiB |
All memory snapshots (bytes, medians of absolute values)
The inactive backend still exists in the host, so the UserCache shared used bytes of a reference sample show the empty segment. Peak is reset per case. In-request graph pins are recorded for each sample.
| Case | Backend | Shared used B | Reference persistent B | PHP reset B | PHP seed B | PHP warm B | PHP after B | PHP peak B | In-request graph pins |
|---|---|---|---|---|---|---|---|---|---|
| null / 1 key · warm · read | UserCache | 3,914,296 | 0 | 495,152 | 496,720 | 496,720 | 498,248 | 498,248 | 0 |
| null / 1 key · warm · read | zval.h reference | 3,914,264 | 392 | 495,152 | 495,864 | 496,264 | 497,792 | 497,792 | 0 |
| bool / 1 key · warm · read | UserCache | 3,914,296 | 0 | 495,152 | 496,720 | 496,720 | 498,248 | 498,248 | 0 |
| bool / 1 key · warm · read | zval.h reference | 3,914,264 | 392 | 495,152 | 495,864 | 496,264 | 497,792 | 497,792 | 0 |
| int / 1 key · warm · read | UserCache | 3,914,296 | 0 | 495,152 | 496,720 | 496,720 | 498,248 | 498,248 | 0 |
| int / 1 key · warm · read | zval.h reference | 3,914,264 | 392 | 495,152 | 495,864 | 496,264 | 497,792 | 497,792 | 0 |
| int / 32,768 keys · warm · read | UserCache | 4,962,840 | 0 | 495,200 | 6,792,080 | 6,792,080 | 6,793,608 | 6,793,608 | 0 |
| int / 32,768 keys · warm · read | zval.h reference | 3,914,264 | 3,670,016 | 495,200 | 2,334,816 | 4,432,024 | 4,433,552 | 4,694,192 | 0 |
| int / 32,768 keys · warm · mutate flag (scalar no-op) | UserCache | 4,962,840 | 0 | 495,200 | 6,792,080 | 6,792,080 | 6,793,608 | 6,793,608 | 0 |
| int / 32,768 keys · warm · mutate flag (scalar no-op) | zval.h reference | 3,914,264 | 3,670,016 | 495,200 | 2,334,816 | 4,432,024 | 4,433,552 | 4,694,192 | 0 |
| int / 32,768 keys · cold · read | UserCache | 4,962,840 | 0 | 495,200 | 6,792,080 | 6,792,080 | 6,793,608 | 6,793,608 | 0 |
| int / 32,768 keys · cold · read | zval.h reference | 3,914,264 | 3,670,016 | 495,184 | 2,334,800 | 2,334,800 | 4,433,536 | 4,694,176 | 0 |
| double / 1 key · warm · read | UserCache | 3,914,296 | 0 | 495,168 | 496,736 | 496,736 | 498,264 | 498,264 | 0 |
| double / 1 key · warm · read | zval.h reference | 3,914,264 | 392 | 495,168 | 495,880 | 496,280 | 497,808 | 497,808 | 0 |
| string32 / 1 key · warm · read | UserCache | 3,914,328 | 0 | 495,176 | 496,808 | 496,872 | 498,400 | 498,400 | 0 |
| string32 / 1 key · warm · read | zval.h reference | 3,914,264 | 456 | 495,176 | 495,952 | 496,416 | 497,944 | 497,944 | 0 |
| string32 / 1 key · warm · mutate | UserCache | 3,914,328 | 0 | 495,192 | 496,824 | 496,888 | 498,416 | 498,416 | 0 |
| string32 / 1 key · warm · mutate | zval.h reference | 3,914,264 | 456 | 495,176 | 495,952 | 496,416 | 497,944 | 497,944 | 0 |
| string300 / 1 key · warm · read | UserCache | 3,914,592 | 0 | 495,176 | 497,128 | 497,128 | 498,656 | 498,656 | 0 |
| string300 / 1 key · warm · read | zval.h reference | 3,914,264 | 720 | 495,176 | 496,672 | 496,672 | 498,200 | 498,200 | 0 |
| string300 / 1 key · warm · mutate | UserCache | 3,914,592 | 0 | 495,192 | 497,144 | 497,144 | 498,672 | 498,672 | 0 |
| string300 / 1 key · warm · mutate | zval.h reference | 3,914,264 | 720 | 495,192 | 496,688 | 496,688 | 498,216 | 498,216 | 0 |
| string300 / 32,768 keys · warm · read | UserCache | 14,923,512 | 0 | 495,208 | 6,792,472 | 6,792,472 | 6,794,000 | 6,794,000 | 0 |
| string300 / 32,768 keys · warm · read | zval.h reference | 3,914,264 | 14,417,920 | 495,208 | 4,432,416 | 4,432,416 | 4,433,944 | 4,694,584 | 0 |
| string300 / 32,768 keys · warm · mutate | UserCache | 14,923,512 | 0 | 495,256 | 6,792,520 | 6,792,520 | 6,794,048 | 6,794,048 | 0 |
| string300 / 32,768 keys · warm · mutate | zval.h reference | 3,914,264 | 14,417,920 | 495,256 | 4,432,464 | 4,432,464 | 4,433,992 | 4,694,632 | 0 |
| string300 / 32,768 keys · cold · read | UserCache | 14,923,512 | 0 | 495,208 | 6,792,472 | 6,792,472 | 6,794,000 | 6,794,000 | 0 |
| string300 / 32,768 keys · cold · read | zval.h reference | 3,914,264 | 14,417,920 | 495,208 | 4,432,416 | 4,432,416 | 4,433,944 | 4,694,584 | 0 |
| string4k / 1 key · warm · read | UserCache | 3,918,488 | 0 | 495,176 | 504,936 | 513,128 | 514,656 | 514,656 | 0 |
| string4k / 1 key · warm · read | zval.h reference | 3,914,264 | 4,520 | 495,176 | 504,080 | 512,672 | 514,200 | 514,200 | 0 |
| string4k / 1 key · warm · mutate | UserCache | 3,918,488 | 0 | 495,192 | 504,952 | 513,144 | 514,672 | 521,368 | 0 |
| string4k / 1 key · warm · mutate | zval.h reference | 3,914,264 | 4,520 | 495,176 | 504,080 | 512,672 | 514,200 | 520,896 | 0 |
| string64k / 1 key · warm · read | UserCache | 3,980,824 | 0 | 495,176 | 566,376 | 636,008 | 637,536 | 637,536 | 0 |
| string64k / 1 key · warm · read | zval.h reference | 3,914,264 | 65,960 | 495,176 | 565,520 | 635,552 | 637,080 | 637,080 | 0 |
| string64k / 1 key · warm · mutate | UserCache | 3,980,824 | 0 | 495,192 | 566,392 | 636,024 | 637,552 | 705,688 | 0 |
| string64k / 1 key · warm · mutate | zval.h reference | 3,914,264 | 65,960 | 495,192 | 565,536 | 635,568 | 637,096 | 705,232 | 0 |
| packed8 / 1 key · warm · read | UserCache | 3,914,528 | 0 | 495,168 | 496,952 | 497,168 | 498,696 | 498,696 | 0 |
| packed8 / 1 key · warm · read | zval.h reference | 3,914,264 | 712 | 495,168 | 496,096 | 496,712 | 498,240 | 498,240 | 0 |
| packed8 / 1 key · warm · read · TTL 3600 | UserCache | 3,914,528 | 0 | 495,200 | 496,984 | 497,200 | 498,728 | 498,728 | 0 |
| packed8 / 1 key · warm · read · TTL 3600 | zval.h reference | 3,914,264 | 712 | 495,200 | 496,128 | 496,744 | 498,272 | 498,272 | 0 |
| packed8 / 1 key · warm · mutate | UserCache | 3,914,528 | 0 | 495,168 | 496,952 | 497,168 | 498,696 | 498,696 | 0 |
| packed8 / 1 key · warm · mutate | zval.h reference | 3,914,264 | 712 | 495,168 | 496,096 | 496,712 | 498,240 | 498,240 | 0 |
| packed8 / 32,768 keys · warm · read | UserCache | 12,565,016 | 0 | 495,200 | 6,792,296 | 13,870,184 | 13,871,712 | 13,871,712 | 0 |
| packed8 / 32,768 keys · warm · read | zval.h reference | 3,914,264 | 14,155,776 | 495,200 | 2,335,032 | 11,510,128 | 11,511,656 | 11,511,656 | 0 |
| packed8 / 32,768 keys · warm · mutate | UserCache | 12,565,016 | 0 | 495,216 | 6,792,312 | 13,870,200 | 13,871,728 | 13,871,728 | 0 |
| packed8 / 32,768 keys · warm · mutate | zval.h reference | 3,914,264 | 14,155,776 | 495,216 | 2,335,048 | 11,510,144 | 11,511,672 | 11,511,672 | 0 |
| packed8 / 32,768 keys · cold · read | UserCache | 12,565,016 | 0 | 495,200 | 6,792,296 | 6,792,296 | 13,871,712 | 13,871,712 | 0 |
| packed8 / 32,768 keys · cold · read | zval.h reference | 3,914,264 | 14,155,776 | 495,200 | 2,335,032 | 2,335,032 | 11,511,656 | 11,511,656 | 0 |
| packed512 / 1 key · warm · read | UserCache | 3,922,712 | 0 | 495,176 | 509,088 | 521,432 | 522,960 | 522,960 | 0 |
| packed512 / 1 key · warm · read | zval.h reference | 3,914,264 | 16,840 | 495,176 | 508,232 | 520,976 | 522,504 | 522,504 | 0 |
| packed512 / 1 key · warm · mutate | UserCache | 3,922,712 | 0 | 495,192 | 509,104 | 521,448 | 522,976 | 533,824 | 0 |
| packed512 / 1 key · warm · mutate | zval.h reference | 3,914,264 | 16,840 | 495,192 | 508,248 | 520,992 | 522,520 | 533,368 | 0 |
| hash32 / 1 key · warm · read | UserCache | 3,916,952 | 0 | 495,168 | 499,352 | 501,968 | 503,496 | 504,088 | 0 |
| hash32 / 1 key · warm · read | zval.h reference | 3,914,264 | 3,008 | 495,168 | 498,496 | 501,512 | 503,040 | 503,040 | 0 |
| hash32 / 1 key · warm · mutate | UserCache | 3,916,952 | 0 | 495,168 | 499,352 | 501,968 | 503,496 | 504,088 | 0 |
| hash32 / 1 key · warm · mutate | zval.h reference | 3,914,264 | 3,008 | 495,168 | 498,496 | 501,512 | 503,040 | 503,040 | 0 |
| hash32 / 32,768 keys · warm · read | UserCache | 91,994,648 | 0 | 495,200 | 6,794,696 | 92,515,784 | 92,517,312 | 92,517,616 | 0 |
| hash32 / 32,768 keys · warm · read | zval.h reference | 3,914,264 | 89,391,104 | 495,200 | 2,337,432 | 90,155,728 | 90,157,256 | 90,157,256 | 0 |
| hash32 / 32,768 keys · warm · mutate | UserCache | 91,994,648 | 0 | 495,216 | 6,794,712 | 92,515,800 | 92,517,328 | 92,517,632 | 0 |
| hash32 / 32,768 keys · warm · mutate | zval.h reference | 3,914,264 | 89,391,104 | 495,216 | 2,337,448 | 90,155,744 | 90,157,272 | 90,157,272 | 0 |
| hash32 / 32,768 keys · cold · read | UserCache | 91,994,648 | 0 | 495,200 | 6,794,696 | 6,794,696 | 92,517,312 | 92,517,616 | 0 |
| hash32 / 32,768 keys · cold · read | zval.h reference | 3,914,264 | 89,391,104 | 495,200 | 2,337,432 | 2,337,432 | 90,157,256 | 90,157,256 | 0 |
| nested / 1 key · warm · read | UserCache | 3,916,600 | 0 | 495,168 | 500,472 | 504,272 | 505,800 | 506,000 | 0 |
| nested / 1 key · warm · read | zval.h reference | 3,914,264 | 4,232 | 495,168 | 499,616 | 503,752 | 505,280 | 505,280 | 0 |
| nested / 1 key · warm · mutate | UserCache | 3,916,600 | 0 | 495,168 | 500,472 | 504,272 | 505,800 | 506,000 | 0 |
| nested / 1 key · warm · mutate | zval.h reference | 3,914,264 | 4,232 | 495,168 | 499,616 | 503,752 | 505,280 | 505,280 | 0 |
| HTTP case | Backend | Shared used B | Reference persistent B | Sampled worker PHP heap B |
|---|---|---|---|---|
| array / read · 1 worker · 100 ops/request | UserCache | 2,019,952 | 0 | 534,104 |
| array / read · 1 worker · 100 ops/request | zval.h reference | 1,991,024 | 36,352 | 528,104 |
| array / read · 2 workers · 100 ops/request | UserCache | 2,019,952 | 0 | 534,104 |
| array / read · 2 workers · 100 ops/request | zval.h reference | 1,991,024 | 36,352 | 528,104 |
| array / read · 4 workers · 100 ops/request | UserCache | 2,019,952 | 0 | 534,104 |
| array / read · 4 workers · 100 ops/request | zval.h reference | 1,991,024 | 36,352 | 528,104 |
| array / 99% read + 1% store · 1 worker · 100 ops/request | UserCache | 2,019,952 | 0 | 534,120 |
| array / 99% read + 1% store · 1 worker · 100 ops/request | zval.h reference | 1,991,024 | 36,352 | 528,120 |
| array / 99% read + 1% store · 2 workers · 100 ops/request | UserCache | 2,019,952 | 0 | 534,120 |
| array / 99% read + 1% store · 2 workers · 100 ops/request | zval.h reference | 1,991,024 | 36,352 | 528,120 |
| array / 99% read + 1% store · 4 workers · 100 ops/request | UserCache | 2,019,952 | 0 | 534,120 |
| array / 99% read + 1% store · 4 workers · 100 ops/request | zval.h reference | 1,991,024 | 36,352 | 528,120 |
| scalar / read · 1 worker · 100 ops/request | UserCache | 1,992,048 | 0 | 493,232 |
| scalar / read · 1 worker · 100 ops/request | zval.h reference | 1,991,024 | 3,328 | 490,304 |
| scalar / read · 2 workers · 100 ops/request | UserCache | 1,992,048 | 0 | 493,232 |
| scalar / read · 2 workers · 100 ops/request | zval.h reference | 1,991,024 | 3,328 | 490,304 |
| scalar / read · 4 workers · 100 ops/request | UserCache | 1,992,048 | 0 | 493,232 |
| scalar / read · 4 workers · 100 ops/request | zval.h reference | 1,991,024 | 3,328 | 490,304 |
| scalar / 99% read + 1% store · 1 worker · 100 ops/request | UserCache | 1,992,048 | 0 | 493,232 |
| scalar / 99% read + 1% store · 1 worker · 100 ops/request | zval.h reference | 1,991,024 | 3,328 | 490,304 |
| scalar / 99% read + 1% store · 2 workers · 100 ops/request | UserCache | 1,992,048 | 0 | 493,232 |
| scalar / 99% read + 1% store · 2 workers · 100 ops/request | zval.h reference | 1,991,024 | 3,328 | 490,304 |
| scalar / 99% read + 1% store · 4 workers · 100 ops/request | UserCache | 1,992,048 | 0 | 493,232 |
| scalar / 99% read + 1% store · 4 workers · 100 ops/request | zval.h reference | 1,991,024 | 3,328 | 490,304 |
| array / read · 1 worker · 1 op/request | UserCache | 2,019,952 | 0 | 534,072 |
| array / read · 1 worker · 1 op/request | zval.h reference | 1,991,024 | 36,352 | 528,056 |
| array / read · 2 workers · 1 op/request | UserCache | 2,019,952 | 0 | 534,072 |
| array / read · 2 workers · 1 op/request | zval.h reference | 1,991,024 | 36,352 | 528,056 |
| array / read · 4 workers · 1 op/request | UserCache | 2,019,952 | 0 | 534,072 |
| array / read · 4 workers · 1 op/request | zval.h reference | 1,991,024 | 36,352 | 528,056 |
| array / 99% read + 1% store · 1 worker · 1 op/request | UserCache | 2,019,952 | 0 | 534,088 |
| array / 99% read + 1% store · 1 worker · 1 op/request | zval.h reference | 1,991,024 | 36,352 | 528,088 |
| array / 99% read + 1% store · 2 workers · 1 op/request | UserCache | 2,019,952 | 0 | 534,088 |
| array / 99% read + 1% store · 2 workers · 1 op/request | zval.h reference | 1,991,024 | 36,352 | 528,088 |
| array / 99% read + 1% store · 4 workers · 1 op/request | UserCache | 2,019,952 | 0 | 534,088 |
| array / 99% read + 1% store · 4 workers · 1 op/request | zval.h reference | 1,991,024 | 36,352 | 528,088 |
| scalar / read · 1 worker · 1 op/request | UserCache | 1,992,048 | 0 | 493,200 |
| scalar / read · 1 worker · 1 op/request | zval.h reference | 1,991,024 | 3,328 | 490,256 |
| scalar / read · 2 workers · 1 op/request | UserCache | 1,992,048 | 0 | 493,200 |
| scalar / read · 2 workers · 1 op/request | zval.h reference | 1,991,024 | 3,328 | 490,256 |
| scalar / read · 4 workers · 1 op/request | UserCache | 1,992,048 | 0 | 493,200 |
| scalar / read · 4 workers · 1 op/request | zval.h reference | 1,991,024 | 3,328 | 490,256 |
| scalar / 99% read + 1% store · 1 worker · 1 op/request | UserCache | 1,992,048 | 0 | 493,200 |
| scalar / 99% read + 1% store · 1 worker · 1 op/request | zval.h reference | 1,991,024 | 3,328 | 490,272 |
| scalar / 99% read + 1% store · 2 workers · 1 op/request | UserCache | 1,992,048 | 0 | 493,200 |
| scalar / 99% read + 1% store · 2 workers · 1 op/request | zval.h reference | 1,991,024 | 3,328 | 490,272 |
| scalar / 99% read + 1% store · 4 workers · 1 op/request | UserCache | 1,992,048 | 0 | 493,200 |
| scalar / 99% read + 1% store · 4 workers · 1 op/request | zval.h reference | 1,991,024 | 3,328 | 490,272 |
A/A measurement noise
The same reference wrapper measured against itself with the same pairing, as second run time ÷ first run time. A UserCache speedup closer to 1.00x than this spread is not a difference; A/A medians beyond ±2% are marked †.
| Case | Second / first median | Observed pair range | Pair p25–p75 | Median 95% interval | Pairs |
|---|---|---|---|---|---|
null1 key · warm · read | 1.012x | 0.767–1.745 | 0.961–1.063 | 0.950–1.066 | 15 |
bool1 key · warm · read | 0.990x | 0.768–1.353 | 0.945–1.045 | 0.910–1.025 | 15 |
int1 key · warm · read | 1.001x | 0.788–1.547 | 0.959–1.041 | 0.960–1.041 | 15 |
int32,768 keys · warm · read | 1.013x | 0.953–1.053 | 1.003–1.019 | 1.004–1.020 | 15 |
int32,768 keys · warm · mutate flag (scalar no-op) | 1.015x | 0.843–1.069 | 0.985–1.030 | 0.975–1.028 | 15 |
int32,768 keys · cold · read | 0.977x † | 0.928–1.166 | 0.949–1.002 | 0.945–1.003 | 15 |
double1 key · warm · read | 1.017x | 0.910–1.310 | 0.978–1.059 | 0.987–1.046 | 15 |
string321 key · warm · read | 0.971x † | 0.858–1.474 | 0.942–1.036 | 0.932–1.041 | 15 |
string321 key · warm · mutate | 0.990x | 0.895–1.397 | 0.954–1.063 | 0.968–1.063 | 15 |
string3001 key · warm · read | 1.000x | 0.928–1.149 | 0.971–1.089 | 0.968–1.085 | 15 |
string3001 key · warm · mutate | 0.943x † | 0.719–1.210 | 0.917–1.034 | 0.903–1.051 | 15 |
string30032,768 keys · warm · read | 1.009x | 0.915–1.081 | 0.978–1.019 | 0.980–1.016 | 15 |
string30032,768 keys · warm · mutate | 0.993x | 0.834–1.061 | 0.973–1.033 | 0.960–1.035 | 15 |
string30032,768 keys · cold · read | 1.019x | 0.840–1.108 | 0.995–1.029 | 0.994–1.030 | 15 |
string4k1 key · warm · read | 0.975x † | 0.789–1.182 | 0.917–1.057 | 0.915–1.072 | 15 |
string4k1 key · warm · mutate | 1.004x | 0.773–1.428 | 0.965–1.078 | 0.969–1.079 | 15 |
string64k1 key · warm · read | 0.972x † | 0.795–1.339 | 0.957–1.024 | 0.956–1.037 | 15 |
string64k1 key · warm · mutate | 0.999x | 0.933–1.120 | 0.967–1.052 | 0.956–1.032 | 15 |
packed81 key · warm · read | 1.005x | 0.926–1.050 | 0.981–1.017 | 0.983–1.024 | 15 |
packed81 key · warm · read · TTL 3600 | 1.003x | 0.664–1.035 | 0.996–1.015 | 0.996–1.018 | 15 |
packed81 key · warm · mutate | 0.983x | 0.932–1.051 | 0.970–1.025 | 0.966–1.016 | 15 |
packed832,768 keys · warm · read | 0.987x | 0.906–1.045 | 0.969–1.011 | 0.963–1.014 | 15 |
packed832,768 keys · warm · mutate | 0.997x | 0.936–1.129 | 0.953–1.026 | 0.954–1.021 | 15 |
packed832,768 keys · cold · read | 0.995x | 0.827–1.059 | 0.982–1.001 | 0.984–1.002 | 15 |
packed5121 key · warm · read | 0.977x † | 0.957–3.000 | 0.973–1.023 | 0.971–1.032 | 15 |
packed5121 key · warm · mutate | 0.999x | 0.942–1.060 | 0.985–1.012 | 0.987–1.017 | 15 |
hash321 key · warm · read | 1.002x | 0.967–1.059 | 0.978–1.016 | 0.980–1.017 | 15 |
hash321 key · warm · mutate | 0.982x | 0.936–1.079 | 0.966–1.027 | 0.955–1.024 | 15 |
hash3232,768 keys · warm · read | 1.132x † | 0.712–1.736 | 1.047–1.162 | 1.045–1.162 | 15 |
hash3232,768 keys · warm · mutate | 1.072x † | 1.033–1.109 | 1.044–1.091 | 1.043–1.090 | 15 |
hash3232,768 keys · cold · read | 1.057x † | 0.631–1.362 | 1.038–1.085 | 1.027–1.083 | 15 |
nested1 key · warm · read | 1.004x | 0.919–1.086 | 0.973–1.030 | 0.966–1.030 | 15 |
nested1 key · warm · mutate | 0.997x | 0.864–1.092 | 0.976–1.026 | 0.982–1.039 | 15 |
Raw helper diagnostic — no cache speed ratio
Reads call persistent_zval_to_request from an already persisted value. They do not persist/free per iteration, perform key lookup, implement TTL or share the warm wrapper prototype cache. The 32,768-key label records the surrounding workload shape; the raw helper still has one source value. This is an allocation/copy lower-level diagnostic, not a public FrankenPHP cache comparison, and never enters the rankings above.
Raw helper timings
| Case shape | Raw helper ns/op | Raw helper CPU ns/op | Samples |
|---|---|---|---|
| null / 1 key · warm · read | 47.5 | 47.4 | 2 |
| bool / 1 key · warm · read | 46.4 | 46.4 | 2 |
| int / 1 key · warm · read | 47.2 | 47.2 | 2 |
| int / 32,768 keys · warm · read | 45.8 | 45.8 | 2 |
| int / 32,768 keys · warm · mutate flag (scalar no-op) | 45.9 | 45.8 | 2 |
| int / 32,768 keys · cold · read | 46.9 | 46.9 | 2 |
| double / 1 key · warm · read | 49.3 | 49.3 | 2 |
| string32 / 1 key · warm · read | 67.8 | 67.8 | 2 |
| string32 / 1 key · warm · mutate | 71.5 | 71.4 | 2 |
| string300 / 1 key · warm · read | 73.5 | 73.5 | 2 |
| string300 / 1 key · warm · mutate | 73.0 | 73.0 | 2 |
| string300 / 32,768 keys · warm · read | 69.7 | 69.0 | 2 |
| string300 / 32,768 keys · warm · mutate | 70.7 | 70.7 | 2 |
| string300 / 32,768 keys · cold · read | 67.2 | 67.2 | 2 |
| string4k / 1 key · warm · read | 106.0 | 105.9 | 2 |
| string4k / 1 key · warm · mutate | 109.5 | 109.5 | 2 |
| string64k / 1 key · warm · read | 907.9 | 907.1 | 2 |
| string64k / 1 key · warm · mutate | 923.2 | 923.0 | 2 |
| packed8 / 1 key · warm · read | 132.6 | 132.5 | 2 |
| packed8 / 1 key · warm · read · TTL 3600 | 131.7 | 131.7 | 2 |
| packed8 / 1 key · warm · mutate | 142.1 | 142.0 | 2 |
| packed8 / 32,768 keys · warm · read | 135.4 | 135.3 | 2 |
| packed8 / 32,768 keys · warm · mutate | 146.4 | 146.4 | 2 |
| packed8 / 32,768 keys · cold · read | 132.1 | 132.1 | 2 |
| packed512 / 1 key · warm · read | 3,594.7 | 3,589.4 | 2 |
| packed512 / 1 key · warm · mutate | 3,632.7 | 3,630.1 | 2 |
| hash32 / 1 key · warm · read | 729.6 | 729.6 | 2 |
| hash32 / 1 key · warm · mutate | 672.6 | 672.6 | 2 |
| hash32 / 32,768 keys · warm · read | 701.9 | 701.5 | 2 |
| hash32 / 32,768 keys · warm · mutate | 791.2 | 791.1 | 2 |
| hash32 / 32,768 keys · cold · read | 664.1 | 663.8 | 2 |
| nested / 1 key · warm · read | 466.8 | 466.6 | 2 |
| nested / 1 key · warm · mutate | 492.8 | 492.7 | 2 |
Environment
| Measured | 2026-09-30T07:54:36.579770+00:00 to 2026-09-30T08:33:50.538804+00:00 |
|---|---|
| Micro and A/A mode | worker |
| Micro pairs | 15 pairs × 2 sessions |
| HTTP rounds | 5 rounds × 5 s |
| CPU affinity | 0-3 |
| Platform | Linux-7.0.14-orbstack-00380-ga7e0a2dc9535-aarch64-with-glibc2.39 |
| CPU count | 10 |
| FrankenPHP revision | 51e6246e71f335b96ac22d7782f5b20392555109 |
| Go | go1.27.0 |
| Compiler | cc (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0 |
| PHP configure | --disable-all --enable-cli --enable-embed=shared --enable-zts --disable-zend-signals --enable-zend-max-execution-timers --enable-pcntl --without-pcre-jit --disable-opcache-jit |
| Verified source inputs | 45,316,114 bytes · SHA-256 93cbd6973cbd24241f3e8a12ed50d5436eff1a91ca45379b0fdd37f2a17822ed |
The source inputs archive includes the exact PHP input tree, harness assets, built source/config files and measurement producer snapshots, and stays in the local measurement workspace. The aggregate result, including provenance and the build manifest, is embedded in this HTML; raw JSONL samples and logs are not published.
Data and provenance
The aggregate result.json is embedded in this page unchanged, in <script id="embedded-result" type="application/json"> (schema_version 1). Its ratios keep the measured direction: micro[] and aa[] rows hold paired_ratio as UserCache time ÷ reference time (this page shows its reciprocal as the speedup) with median_ratio_ci95, and http[] rows hold paired_throughput_ratio as UserCache ÷ reference. Per-backend medians are under backends.user_cache and backends.reference.
JSON.parse(document.getElementById('embedded-result').textContent)
Official helper: pinned FrankenPHP zval.h. Build manifest and binary/library/fixture SHA-256 values are stored in the aggregate JSON.
Configuration and environment
{
"created_at": "2026-09-30T07:54:36.579770+00:00",
"configuration": {
"build_dir": "/workspaces/php-src/php-user_cache_benchmark_harness/runtime/frankenphp",
"output_dir": "/workspaces/php-src/php-user_cache_benchmark_harness/results/persistence-20260930T075436.577836Z",
"output": "/workspaces/php-src/php-user_cache_benchmark_harness/BENCH_RESULT_PERSISTENCE.html",
"build": false,
"php_src": "/workspaces/php-src",
"frankenphp_src": null,
"jobs": 2,
"quick": false,
"pairs": 15,
"rounds": 5,
"sessions": 2,
"seconds": 5,
"cpus": "0-3",
"seed": 1701,
"stage": "all",
"mode": "worker",
"payloads": [
"null",
"bool",
"int",
"double",
"string32",
"string300",
"string4k",
"string64k",
"packed8",
"packed512",
"hash32",
"nested"
],
"workers": [
"1",
"2",
"4"
],
"operations": [
"1",
"100"
],
"kinds": [
"array",
"scalar"
],
"modes": [
"read",
"mixed"
]
},
"environment": {
"platform": "Linux-7.0.14-orbstack-00380-ga7e0a2dc9535-aarch64-with-glibc2.39",
"machine": "aarch64",
"python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]",
"cpu_count": 10,
"affinity": [
0,
1,
2,
3,
4,
5,
6,
7,
8,
9
]
},
"binaries": {
"bench": {
"path": "/workspaces/php-src/php-user_cache_benchmark_harness/runtime/frankenphp/bin/frankenphp-bench",
"sha256": "8da32f12b5fa65223d78f037b0388cfd8201ccfd7062e1a50634cf428d6d554d"
},
"scale": {
"path": "/workspaces/php-src/php-user_cache_benchmark_harness/runtime/frankenphp/bin/frankenphp-scale",
"sha256": "545e5ddebd42b75cbdddb0b99dfe84338b423a446a1c58abcdd55585775f6ca6"
}
},
"php_libraries": {
"/workspaces/php-src/php-user_cache_benchmark_harness/runtime/frankenphp/install/lib/libphp.so": "2bebc91ccd5d1086684691a6bffbcd030ab9dbab7b8f17cae2ca594042bf1106"
}
}243 executions, 243 validated
| Execution | Sample validation | Exit |
|---|---|---|
| aa-s1 | validated | 0 |
| micro-s1 | validated | 0 |
| micro-s2 | validated | 0 |
| http-array-w1-o1-read-r0-user_cache | validated | 0 |
| http-array-w1-o1-read-r0-reference | validated | 0 |
| http-array-w1-o1-read-r1-reference | validated | 0 |
| http-array-w1-o1-read-r1-user_cache | validated | 0 |
| http-array-w1-o1-read-r2-user_cache | validated | 0 |
| http-array-w1-o1-read-r2-reference | validated | 0 |
| http-array-w1-o1-read-r3-reference | validated | 0 |
| http-array-w1-o1-read-r3-user_cache | validated | 0 |
| http-array-w1-o1-read-r4-user_cache | validated | 0 |
| http-array-w1-o1-read-r4-reference | validated | 0 |
| http-array-w1-o1-mixed-r0-user_cache | validated | 0 |
| http-array-w1-o1-mixed-r0-reference | validated | 0 |
| http-array-w1-o1-mixed-r1-reference | validated | 0 |
| http-array-w1-o1-mixed-r1-user_cache | validated | 0 |
| http-array-w1-o1-mixed-r2-user_cache | validated | 0 |
| http-array-w1-o1-mixed-r2-reference | validated | 0 |
| http-array-w1-o1-mixed-r3-reference | validated | 0 |
| http-array-w1-o1-mixed-r3-user_cache | validated | 0 |
| http-array-w1-o1-mixed-r4-user_cache | validated | 0 |
| http-array-w1-o1-mixed-r4-reference | validated | 0 |
| http-array-w1-o100-read-r0-user_cache | validated | 0 |
| http-array-w1-o100-read-r0-reference | validated | 0 |
| http-array-w1-o100-read-r1-reference | validated | 0 |
| http-array-w1-o100-read-r1-user_cache | validated | 0 |
| http-array-w1-o100-read-r2-user_cache | validated | 0 |
| http-array-w1-o100-read-r2-reference | validated | 0 |
| http-array-w1-o100-read-r3-reference | validated | 0 |
| http-array-w1-o100-read-r3-user_cache | validated | 0 |
| http-array-w1-o100-read-r4-user_cache | validated | 0 |
| http-array-w1-o100-read-r4-reference | validated | 0 |
| http-array-w1-o100-mixed-r0-user_cache | validated | 0 |
| http-array-w1-o100-mixed-r0-reference | validated | 0 |
| http-array-w1-o100-mixed-r1-reference | validated | 0 |
| http-array-w1-o100-mixed-r1-user_cache | validated | 0 |
| http-array-w1-o100-mixed-r2-user_cache | validated | 0 |
| http-array-w1-o100-mixed-r2-reference | validated | 0 |
| http-array-w1-o100-mixed-r3-reference | validated | 0 |
| http-array-w1-o100-mixed-r3-user_cache | validated | 0 |
| http-array-w1-o100-mixed-r4-user_cache | validated | 0 |
| http-array-w1-o100-mixed-r4-reference | validated | 0 |
| http-array-w2-o1-read-r0-reference | validated | 0 |
| http-array-w2-o1-read-r0-user_cache | validated | 0 |
| http-array-w2-o1-read-r1-user_cache | validated | 0 |
| http-array-w2-o1-read-r1-reference | validated | 0 |
| http-array-w2-o1-read-r2-reference | validated | 0 |
| http-array-w2-o1-read-r2-user_cache | validated | 0 |
| http-array-w2-o1-read-r3-user_cache | validated | 0 |
| http-array-w2-o1-read-r3-reference | validated | 0 |
| http-array-w2-o1-read-r4-reference | validated | 0 |
| http-array-w2-o1-read-r4-user_cache | validated | 0 |
| http-array-w2-o1-mixed-r0-reference | validated | 0 |
| http-array-w2-o1-mixed-r0-user_cache | validated | 0 |
| http-array-w2-o1-mixed-r1-user_cache | validated | 0 |
| http-array-w2-o1-mixed-r1-reference | validated | 0 |
| http-array-w2-o1-mixed-r2-reference | validated | 0 |
| http-array-w2-o1-mixed-r2-user_cache | validated | 0 |
| http-array-w2-o1-mixed-r3-user_cache | validated | 0 |
| http-array-w2-o1-mixed-r3-reference | validated | 0 |
| http-array-w2-o1-mixed-r4-reference | validated | 0 |
| http-array-w2-o1-mixed-r4-user_cache | validated | 0 |
| http-array-w2-o100-read-r0-reference | validated | 0 |
| http-array-w2-o100-read-r0-user_cache | validated | 0 |
| http-array-w2-o100-read-r1-user_cache | validated | 0 |
| http-array-w2-o100-read-r1-reference | validated | 0 |
| http-array-w2-o100-read-r2-reference | validated | 0 |
| http-array-w2-o100-read-r2-user_cache | validated | 0 |
| http-array-w2-o100-read-r3-user_cache | validated | 0 |
| http-array-w2-o100-read-r3-reference | validated | 0 |
| http-array-w2-o100-read-r4-reference | validated | 0 |
| http-array-w2-o100-read-r4-user_cache | validated | 0 |
| http-array-w2-o100-mixed-r0-reference | validated | 0 |
| http-array-w2-o100-mixed-r0-user_cache | validated | 0 |
| http-array-w2-o100-mixed-r1-user_cache | validated | 0 |
| http-array-w2-o100-mixed-r1-reference | validated | 0 |
| http-array-w2-o100-mixed-r2-reference | validated | 0 |
| http-array-w2-o100-mixed-r2-user_cache | validated | 0 |
| http-array-w2-o100-mixed-r3-user_cache | validated | 0 |
| http-array-w2-o100-mixed-r3-reference | validated | 0 |
| http-array-w2-o100-mixed-r4-reference | validated | 0 |
| http-array-w2-o100-mixed-r4-user_cache | validated | 0 |
| http-array-w4-o1-read-r0-reference | validated | 0 |
| http-array-w4-o1-read-r0-user_cache | validated | 0 |
| http-array-w4-o1-read-r1-user_cache | validated | 0 |
| http-array-w4-o1-read-r1-reference | validated | 0 |
| http-array-w4-o1-read-r2-reference | validated | 0 |
| http-array-w4-o1-read-r2-user_cache | validated | 0 |
| http-array-w4-o1-read-r3-user_cache | validated | 0 |
| http-array-w4-o1-read-r3-reference | validated | 0 |
| http-array-w4-o1-read-r4-reference | validated | 0 |
| http-array-w4-o1-read-r4-user_cache | validated | 0 |
| http-array-w4-o1-mixed-r0-reference | validated | 0 |
| http-array-w4-o1-mixed-r0-user_cache | validated | 0 |
| http-array-w4-o1-mixed-r1-user_cache | validated | 0 |
| http-array-w4-o1-mixed-r1-reference | validated | 0 |
| http-array-w4-o1-mixed-r2-reference | validated | 0 |
| http-array-w4-o1-mixed-r2-user_cache | validated | 0 |
| http-array-w4-o1-mixed-r3-user_cache | validated | 0 |
| http-array-w4-o1-mixed-r3-reference | validated | 0 |
| http-array-w4-o1-mixed-r4-reference | validated | 0 |
| http-array-w4-o1-mixed-r4-user_cache | validated | 0 |
| http-array-w4-o100-read-r0-user_cache | validated | 0 |
| http-array-w4-o100-read-r0-reference | validated | 0 |
| http-array-w4-o100-read-r1-reference | validated | 0 |
| http-array-w4-o100-read-r1-user_cache | validated | 0 |
| http-array-w4-o100-read-r2-user_cache | validated | 0 |
| http-array-w4-o100-read-r2-reference | validated | 0 |
| http-array-w4-o100-read-r3-reference | validated | 0 |
| http-array-w4-o100-read-r3-user_cache | validated | 0 |
| http-array-w4-o100-read-r4-user_cache | validated | 0 |
| http-array-w4-o100-read-r4-reference | validated | 0 |
| http-array-w4-o100-mixed-r0-user_cache | validated | 0 |
| http-array-w4-o100-mixed-r0-reference | validated | 0 |
| http-array-w4-o100-mixed-r1-reference | validated | 0 |
| http-array-w4-o100-mixed-r1-user_cache | validated | 0 |
| http-array-w4-o100-mixed-r2-user_cache | validated | 0 |
| http-array-w4-o100-mixed-r2-reference | validated | 0 |
| http-array-w4-o100-mixed-r3-reference | validated | 0 |
| http-array-w4-o100-mixed-r3-user_cache | validated | 0 |
| http-array-w4-o100-mixed-r4-user_cache | validated | 0 |
| http-array-w4-o100-mixed-r4-reference | validated | 0 |
| http-scalar-w1-o1-read-r0-reference | validated | 0 |
| http-scalar-w1-o1-read-r0-user_cache | validated | 0 |
| http-scalar-w1-o1-read-r1-user_cache | validated | 0 |
| http-scalar-w1-o1-read-r1-reference | validated | 0 |
| http-scalar-w1-o1-read-r2-reference | validated | 0 |
| http-scalar-w1-o1-read-r2-user_cache | validated | 0 |
| http-scalar-w1-o1-read-r3-user_cache | validated | 0 |
| http-scalar-w1-o1-read-r3-reference | validated | 0 |
| http-scalar-w1-o1-read-r4-reference | validated | 0 |
| http-scalar-w1-o1-read-r4-user_cache | validated | 0 |
| http-scalar-w1-o1-mixed-r0-reference | validated | 0 |
| http-scalar-w1-o1-mixed-r0-user_cache | validated | 0 |
| http-scalar-w1-o1-mixed-r1-user_cache | validated | 0 |
| http-scalar-w1-o1-mixed-r1-reference | validated | 0 |
| http-scalar-w1-o1-mixed-r2-reference | validated | 0 |
| http-scalar-w1-o1-mixed-r2-user_cache | validated | 0 |
| http-scalar-w1-o1-mixed-r3-user_cache | validated | 0 |
| http-scalar-w1-o1-mixed-r3-reference | validated | 0 |
| http-scalar-w1-o1-mixed-r4-reference | validated | 0 |
| http-scalar-w1-o1-mixed-r4-user_cache | validated | 0 |
| http-scalar-w1-o100-read-r0-reference | validated | 0 |
| http-scalar-w1-o100-read-r0-user_cache | validated | 0 |
| http-scalar-w1-o100-read-r1-user_cache | validated | 0 |
| http-scalar-w1-o100-read-r1-reference | validated | 0 |
| http-scalar-w1-o100-read-r2-reference | validated | 0 |
| http-scalar-w1-o100-read-r2-user_cache | validated | 0 |
| http-scalar-w1-o100-read-r3-user_cache | validated | 0 |
| http-scalar-w1-o100-read-r3-reference | validated | 0 |
| http-scalar-w1-o100-read-r4-reference | validated | 0 |
| http-scalar-w1-o100-read-r4-user_cache | validated | 0 |
| http-scalar-w1-o100-mixed-r0-reference | validated | 0 |
| http-scalar-w1-o100-mixed-r0-user_cache | validated | 0 |
| http-scalar-w1-o100-mixed-r1-user_cache | validated | 0 |
| http-scalar-w1-o100-mixed-r1-reference | validated | 0 |
| http-scalar-w1-o100-mixed-r2-reference | validated | 0 |
| http-scalar-w1-o100-mixed-r2-user_cache | validated | 0 |
| http-scalar-w1-o100-mixed-r3-user_cache | validated | 0 |
| http-scalar-w1-o100-mixed-r3-reference | validated | 0 |
| http-scalar-w1-o100-mixed-r4-reference | validated | 0 |
| http-scalar-w1-o100-mixed-r4-user_cache | validated | 0 |
| http-scalar-w2-o1-read-r0-reference | validated | 0 |
| http-scalar-w2-o1-read-r0-user_cache | validated | 0 |
| http-scalar-w2-o1-read-r1-user_cache | validated | 0 |
| http-scalar-w2-o1-read-r1-reference | validated | 0 |
| http-scalar-w2-o1-read-r2-reference | validated | 0 |
| http-scalar-w2-o1-read-r2-user_cache | validated | 0 |
| http-scalar-w2-o1-read-r3-user_cache | validated | 0 |
| http-scalar-w2-o1-read-r3-reference | validated | 0 |
| http-scalar-w2-o1-read-r4-reference | validated | 0 |
| http-scalar-w2-o1-read-r4-user_cache | validated | 0 |
| http-scalar-w2-o1-mixed-r0-reference | validated | 0 |
| http-scalar-w2-o1-mixed-r0-user_cache | validated | 0 |
| http-scalar-w2-o1-mixed-r1-user_cache | validated | 0 |
| http-scalar-w2-o1-mixed-r1-reference | validated | 0 |
| http-scalar-w2-o1-mixed-r2-reference | validated | 0 |
| http-scalar-w2-o1-mixed-r2-user_cache | validated | 0 |
| http-scalar-w2-o1-mixed-r3-user_cache | validated | 0 |
| http-scalar-w2-o1-mixed-r3-reference | validated | 0 |
| http-scalar-w2-o1-mixed-r4-reference | validated | 0 |
| http-scalar-w2-o1-mixed-r4-user_cache | validated | 0 |
| http-scalar-w2-o100-read-r0-reference | validated | 0 |
| http-scalar-w2-o100-read-r0-user_cache | validated | 0 |
| http-scalar-w2-o100-read-r1-user_cache | validated | 0 |
| http-scalar-w2-o100-read-r1-reference | validated | 0 |
| http-scalar-w2-o100-read-r2-reference | validated | 0 |
| http-scalar-w2-o100-read-r2-user_cache | validated | 0 |
| http-scalar-w2-o100-read-r3-user_cache | validated | 0 |
| http-scalar-w2-o100-read-r3-reference | validated | 0 |
| http-scalar-w2-o100-read-r4-reference | validated | 0 |
| http-scalar-w2-o100-read-r4-user_cache | validated | 0 |
| http-scalar-w2-o100-mixed-r0-reference | validated | 0 |
| http-scalar-w2-o100-mixed-r0-user_cache | validated | 0 |
| http-scalar-w2-o100-mixed-r1-user_cache | validated | 0 |
| http-scalar-w2-o100-mixed-r1-reference | validated | 0 |
| http-scalar-w2-o100-mixed-r2-reference | validated | 0 |
| http-scalar-w2-o100-mixed-r2-user_cache | validated | 0 |
| http-scalar-w2-o100-mixed-r3-user_cache | validated | 0 |
| http-scalar-w2-o100-mixed-r3-reference | validated | 0 |
| http-scalar-w2-o100-mixed-r4-reference | validated | 0 |
| http-scalar-w2-o100-mixed-r4-user_cache | validated | 0 |
| http-scalar-w4-o1-read-r0-user_cache | validated | 0 |
| http-scalar-w4-o1-read-r0-reference | validated | 0 |
| http-scalar-w4-o1-read-r1-reference | validated | 0 |
| http-scalar-w4-o1-read-r1-user_cache | validated | 0 |
| http-scalar-w4-o1-read-r2-user_cache | validated | 0 |
| http-scalar-w4-o1-read-r2-reference | validated | 0 |
| http-scalar-w4-o1-read-r3-reference | validated | 0 |
| http-scalar-w4-o1-read-r3-user_cache | validated | 0 |
| http-scalar-w4-o1-read-r4-user_cache | validated | 0 |
| http-scalar-w4-o1-read-r4-reference | validated | 0 |
| http-scalar-w4-o1-mixed-r0-reference | validated | 0 |
| http-scalar-w4-o1-mixed-r0-user_cache | validated | 0 |
| http-scalar-w4-o1-mixed-r1-user_cache | validated | 0 |
| http-scalar-w4-o1-mixed-r1-reference | validated | 0 |
| http-scalar-w4-o1-mixed-r2-reference | validated | 0 |
| http-scalar-w4-o1-mixed-r2-user_cache | validated | 0 |
| http-scalar-w4-o1-mixed-r3-user_cache | validated | 0 |
| http-scalar-w4-o1-mixed-r3-reference | validated | 0 |
| http-scalar-w4-o1-mixed-r4-reference | validated | 0 |
| http-scalar-w4-o1-mixed-r4-user_cache | validated | 0 |
| http-scalar-w4-o100-read-r0-reference | validated | 0 |
| http-scalar-w4-o100-read-r0-user_cache | validated | 0 |
| http-scalar-w4-o100-read-r1-user_cache | validated | 0 |
| http-scalar-w4-o100-read-r1-reference | validated | 0 |
| http-scalar-w4-o100-read-r2-reference | validated | 0 |
| http-scalar-w4-o100-read-r2-user_cache | validated | 0 |
| http-scalar-w4-o100-read-r3-user_cache | validated | 0 |
| http-scalar-w4-o100-read-r3-reference | validated | 0 |
| http-scalar-w4-o100-read-r4-reference | validated | 0 |
| http-scalar-w4-o100-read-r4-user_cache | validated | 0 |
| http-scalar-w4-o100-mixed-r0-user_cache | validated | 0 |
| http-scalar-w4-o100-mixed-r0-reference | validated | 0 |
| http-scalar-w4-o100-mixed-r1-reference | validated | 0 |
| http-scalar-w4-o100-mixed-r1-user_cache | validated | 0 |
| http-scalar-w4-o100-mixed-r2-user_cache | validated | 0 |
| http-scalar-w4-o100-mixed-r2-reference | validated | 0 |
| http-scalar-w4-o100-mixed-r3-reference | validated | 0 |
| http-scalar-w4-o100-mixed-r3-user_cache | validated | 0 |
| http-scalar-w4-o100-mixed-r4-user_cache | validated | 0 |
| http-scalar-w4-o100-mixed-r4-reference | validated | 0 |
Notes
Measurement contract
Micro/A/A execution mode: worker. Worker mode retains the PHP execution between HTTP requests; classic mode starts a fresh PHP request for each micro/A/A HTTP sample. Each sample performs its seed and warmup in that same PHP execution. HTTP scaling always uses persistent workers, independently of this option.
Worker-mode samples must have zero outstanding graph pins. Classic samples record a nonnegative pin count during the PHP request, when borrowed shared values may legitimately remain pinned; this observation does not verify their release after request shutdown.
Workloads
Dynamic payloads are created at runtime, with OPcache and JIT disabled. Seed/persist, setup and warmup are outside the timed fetch batch. Both cache wrappers include lookup, generation/TTL invalidation and warm PHP-heap COW caching; the raw helper reads an already persisted source and excludes cache lookup. Cold means the first fetch after store, including any store-time string COW seeding; there is no cold one-key row. The retained integer mutate-flag case does not mutate integers.
Common cases cover null, boolean, integer, double, strings and nested arrays; object hooks, references, aliases/cycles and UserCache-specific native object support are outside this reference comparison. Mutation checks verify the cached source remains unchanged. Fetched values are released each iteration: these memory figures do not measure retaining an unbounded list of returned values. Stores in the mixed HTTP workload are reported together with reads; this is not an isolated store benchmark.
Pairing and statistics
Independent hosts run sequentially. Micro samples use randomized paired backend order; HTTP pairs alternate order within each case. A/A runs use the same reference wrapper twice to expose local noise. Every case stays visible, including cases within the interval and cases the reference wins. Raw scalar/immutable-pointer helpers can be lower bounds that a full cache cannot beat. The supplied fixtures are dynamic; OPcache-immutable fixtures are not mixed into these results.
Timing tables use per-backend medians. Ratios are medians of matched pairs, not ratios of pooled means; intervals are a paired bootstrap 95% interval for the median when at least two pairs exist. Intervals from very few pairs are exploratory. Lower latency/CPU is better; higher HTTP throughput is better.
HTTP scope
Request and operation rates are separate; all individual response samples and status/pin checks are retained.
The loopback HTTP client and server run in the same Go process and share its CPU affinity. HTTP throughput includes client, server and networking overhead; it is not an isolated remote-client server-capacity result. Thread CPU measurements cover the PHP thread only, not total Go host/client CPU. With more workers, the client and the workers compete for the same CPUs and intervals widen.