OPcache User Cache Performance Report

Generated at 2026-07-01T16:01:18+00:00. Times are in microseconds; lower is faster.

CLI repeated read13/13 UserCache winsMedian APCu/UserCache: 24.54x
CLI store2/13 UserCache winsMedian APCu/UserCache: 0.34x
FPM one fetch/request13/13 UserCache winsMedian APCu/UserCache: 5.44x
FPM hot read11/11 UserCache winsMedian APCu/UserCache: 52.06x

Environment

PHP8.6.0-dev (cli)
Thread SafetyNTS
Binary/workspaces/php-src/sapi/cli/php
SystemLinux 498c42d87ff4 7.0.11-orbstack-00360-gc9bc4d96ac70 #1 SMP PREEMPT Thu Jun 4 16:40:25 UTC 2026 aarch64
opcache.user_cache_shm_size128M
Loaded benchmark extensionszend_opcache, apcu, deepclone

CLI Repeated Read

WorkloadUserCacheAPCuDeepCloneAPCu/UserCache
constant_array0.157 usmedian 0.1572.119 usmedian 2.1112.199 usmedian 2.18113.54x
route_table_read0.191 usmedian 0.191211.221 usmedian 200.922184.798 usmedian 182.0081,104.64x
large_array0.151 usmedian 0.15190.238 usmedian 89.69090.461 usmedian 89.639597.96x
large_string0.113 usmedian 0.1125.331 usmedian 5.3565.539 usmedian 5.56747.36x
large_object_graph0.177 usmedian 0.17892.972 usmedian 91.569100.508 usmedian 101.000523.85x
metadata_object_read0.250 usmedian 0.251179.818 usmedian 179.112178.231 usmedian 177.878717.87x
metadata_object_fetch_mutate0.325 usmedian 0.324175.146 usmedian 174.267179.524 usmedian 179.555539.26x
safe_direct_object0.542 usmedian 0.5422.381 usmedian 2.3704.044 usmedian 4.0544.39x
spl_collection_object0.794 usmedian 0.79319.485 usmedian 19.38420.772 usmedian 20.65024.54x
spl_linked_collection_object1.698 usmedian 1.74819.370 usmedian 19.24020.930 usmedian 20.85511.41x
spl_heap_object1.306 usmedian 1.30231.244 usmedian 30.76231.699 usmedian 31.61523.93x
carbon_datetime_object30.369 usmedian 29.744180.527 usmedian 178.848225.110 usmedian 224.5465.94x
carbon_model_object30.239 usmedian 30.093192.792 usmedian 191.382221.118 usmedian 220.6966.38x

CLI Store

WorkloadUserCacheAPCuDeepCloneAPCu/UserCache
constant_arraystore trade-off note3.136 usmedian 3.1351.258 usmedian 1.2551.319 usmedian 1.3210.40x
route_table_readstore trade-off note322.105 usmedian 320.36787.303 usmedian 86.353103.537 usmedian 103.6180.27x
large_arraystore trade-off note167.485 usmedian 164.45949.800 usmedian 49.70364.191 usmedian 64.1320.30x
large_stringstore trade-off note11.083 usmedian 11.0774.318 usmedian 4.31512.919 usmedian 12.8760.39x
large_object_graphstore trade-off note161.895 usmedian 161.82351.788 usmedian 52.54864.944 usmedian 64.7660.32x
metadata_object_readstore trade-off note335.535 usmedian 334.89492.052 usmedian 91.735110.168 usmedian 109.9220.27x
metadata_object_fetch_mutatestore trade-off note343.825 usmedian 344.96790.337 usmedian 90.251111.316 usmedian 111.4110.26x
safe_direct_objectstore trade-off note2.933 usmedian 2.9191.212 usmedian 1.2063.255 usmedian 3.2500.41x
spl_collection_objectstore trade-off note35.566 usmedian 35.37911.036 usmedian 11.01016.115 usmedian 16.1330.31x
spl_linked_collection_objectstore trade-off note31.725 usmedian 31.79011.770 usmedian 11.74216.003 usmedian 15.9750.37x
spl_heap_objectstore trade-off note55.895 usmedian 55.77318.768 usmedian 18.65624.118 usmedian 24.0760.34x
carbon_datetime_object203.404 usmedian 203.849289.868 usmedian 289.499360.186 usmedian 360.6241.43x
carbon_model_object225.221 usmedian 224.219317.405 usmedian 316.673380.116 usmedian 380.1241.41x

FPM One Fetch Per Request

WorkloadUserCacheAPCuDeepCloneAPCu/UserCacheWorkers
constant_array2.292 usmedian 1.5007.607 usmedian 7.0426.813 usmedian 5.8963.32x5
route_table_read3.910 usmedian 3.542472.488 usmedian 468.500476.440 usmedian 482.104120.85x5
large_array3.756 usmedian 3.521276.874 usmedian 278.208263.452 usmedian 265.27073.71x5
large_string5.743 usmedian 3.58418.456 usmedian 15.27117.801 usmedian 13.9593.21x5
large_object_graph36.849 usmedian 36.230226.388 usmedian 224.166231.226 usmedian 235.5216.14x5
metadata_object_read101.490 usmedian 94.167474.141 usmedian 492.604359.705 usmedian 323.9584.67x5
metadata_object_fetch_mutate77.060 usmedian 74.000419.406 usmedian 430.271510.993 usmedian 486.7505.44x5
safe_direct_object16.376 usmedian 13.72924.397 usmedian 20.06328.171 usmedian 25.0841.49x5
spl_collection_object9.303 usmedian 8.12561.867 usmedian 59.50066.477 usmedian 65.9596.65x5
spl_linked_collection_object11.309 usmedian 9.54267.708 usmedian 65.18866.433 usmedian 64.9805.99x5
spl_heap_object7.317 usmedian 6.063104.465 usmedian 103.521110.114 usmedian 108.14614.28x5
carbon_datetime_object296.946 usmedian 297.583605.159 usmedian 590.167612.603 usmedian 595.8342.04x5
carbon_model_object308.572 usmedian 316.979601.078 usmedian 610.396687.385 usmedian 687.9171.95x5

FPM Hot Read

WorkloadUserCacheAPCuDeepCloneAPCu/UserCacheWorkers
route_table_read0.462 usmedian 0.401203.533 usmedian 216.544176.848 usmedian 160.294440.51x5
large_array0.223 usmedian 0.21296.877 usmedian 89.92197.985 usmedian 90.478434.99x5
large_string0.165 usmedian 0.1378.595 usmedian 9.5648.967 usmedian 9.57052.06x5
large_object_graph0.576 usmedian 0.57397.342 usmedian 91.60198.284 usmedian 91.729169.06x5
metadata_object_read0.911 usmedian 0.912189.581 usmedian 173.893200.635 usmedian 194.952208.13x5
metadata_object_fetch_mutate1.028 usmedian 1.031191.605 usmedian 177.608202.894 usmedian 188.424186.33x5
safe_direct_object0.701 usmedian 0.6932.710 usmedian 2.6884.656 usmedian 4.5793.86x5
spl_collection_object0.940 usmedian 0.92722.786 usmedian 22.01624.844 usmedian 24.10024.24x5
spl_heap_object1.427 usmedian 1.41833.968 usmedian 32.64036.419 usmedian 34.16123.81x5
carbon_datetime_object34.331 usmedian 33.028209.218 usmedian 190.512282.133 usmedian 278.8576.09x5
carbon_model_object44.108 usmedian 42.354273.962 usmedian 264.983354.067 usmedian 357.7726.21x5

Resident Payload Probe

WorkloadResident direct accessUserCache fetch + accessEstimated fetch overheadResident / UserCache
constant_arrayresident baseline note0.058 us0.157 us0.098 us0.37x
route_table_readresident baseline note0.101 us0.191 us0.090 us0.53x
large_arrayresident baseline note0.068 us0.151 us0.083 us0.45x
large_stringresident baseline note0.033 us0.113 us0.079 us0.30x

Bulk Read: 32 Keys

BackendMean/batchMedian/batchMean/key
user_cache_fetch_multiple1.195 us1.156 us0.037 us
user_cache_fetch_loop1.986 us1.969 us0.062 us
apcu_fetch_multiple9.330 us9.240 us0.292 us
apcu_fetch_loop10.252 us10.257 us0.320 us

Bulk Read: 128 Keys

BackendMean/batchMedian/batchMean/key
user_cache_fetch_multiple4.663 us4.587 us0.036 us
user_cache_fetch_loop7.933 us7.930 us0.062 us
apcu_fetch_multiple39.028 us38.712 us0.305 us
apcu_fetch_loop42.742 us42.411 us0.334 us

Artifacts

ArtifactPath
CLI repeated read JSON/workspaces/php-src/php-opcache_user_cache_benchmark_harness/results/nts-clean-20260701T155740Z/cli-read/user-cache-benchmark-20260701-160044.json
CLI write JSON/workspaces/php-src/php-opcache_user_cache_benchmark_harness/results/nts-clean-20260701T155740Z/cli-write/user-cache-benchmark-20260701-160059.json
Resident probe JSON/workspaces/php-src/php-opcache_user_cache_benchmark_harness/results/nts-clean-20260701T155740Z/resident-payload-probe.json
FPM one fetch/request JSON/workspaces/php-src/php-opcache_user_cache_benchmark_harness/results/nts-clean-20260701T155740Z/fpm-read-once.json
FPM hot read JSON/workspaces/php-src/php-opcache_user_cache_benchmark_harness/results/nts-clean-20260701T155740Z/fpm-read-hot.json
Bulk read JSON #1/workspaces/php-src/php-opcache_user_cache_benchmark_harness/results/nts-clean-20260701T155740Z/bulk-read-32.json
Bulk read JSON #2/workspaces/php-src/php-opcache_user_cache_benchmark_harness/results/nts-clean-20260701T155740Z/bulk-read-128.json

Workloads

Click a workload name in the result tables to jump to its description. CLI repeated read stores the payload before timing, then measures only fetch() plus the access probe. CLI store repeatedly stores the payload over the configured key space. Resident direct access runs only the access probe against an already-resident payload. FPM rows run the same fetch path through nginx/php-fpm workers. Bulk read primes multiple keys, then measures fetching the whole key set.

WorkloadWhat It MeasuresMeasured In
constant_arrayConstant arraySmall immutable constant-array payload.Mutates fetched copy: noCLI repeated read, CLI store, Resident direct access, FPM one fetch/request
route_table_readCompiled route table readFramework-shaped compiled route table and URL generator arrays.Mutates fetched copy: noCLI repeated read, CLI store, Resident direct access, FPM one fetch/request, FPM hot read
large_arrayLarge nested arrayLarger object-free nested array with repeated scalar leaves.Mutates fetched copy: noCLI repeated read, CLI store, Resident direct access, FPM one fetch/request, FPM hot read
large_stringLarge immutable stringLarge string payload that stresses byte-copy avoidance on repeated reads.Mutates fetched copy: noCLI repeated read, CLI store, Resident direct access, FPM one fetch/request, FPM hot read
large_object_graphLarge direct userland-object graphLarge payload object containing many array rows and a child object.Mutates fetched copy: noCLI repeated read, CLI store, FPM one fetch/request, FPM hot read
metadata_object_readApplication metadata object readApplication metadata object with route and service metadata arrays.Mutates fetched copy: noCLI repeated read, CLI store, FPM one fetch/request, FPM hot read
metadata_object_fetch_mutateApplication metadata object fetch and mutateFetches a cached userland object graph, then mutates the fetched copy.Mutates fetched copy: yesCLI repeated read, CLI store, FPM one fetch/request, FPM hot read
safe_direct_objectDateTime/DateInterval direct-restore objectDateTimeImmutable, DateTimeZone, and DateInterval safe-direct state.Mutates fetched copy: noCLI repeated read, CLI store, FPM one fetch/request, FPM hot read
spl_collection_objectSPL collection direct-restore objectArrayObject, ArrayIterator, RecursiveArrayIterator, and SplFixedArray state.Mutates fetched copy: noCLI repeated read, CLI store, FPM one fetch/request, FPM hot read
spl_linked_collection_objectSPL linked-list direct-restore objectSplDoublyLinkedList, SplQueue, and SplStack state.Mutates fetched copy: noCLI repeated read, CLI store, FPM one fetch/request
spl_heap_objectSPL heap direct-restore objectSplMinHeap, SplMaxHeap, and SplPriorityQueue state.Mutates fetched copy: noCLI repeated read, CLI store, FPM one fetch/request, FPM hot read
carbon_datetime_objectCarbon DateTime serializer objectCarbonImmutable/Carbon/CarbonTimeZone object graph used to compare DateTime-derived restore costs.Mutates fetched copy: noCLI repeated read, CLI store, FPM one fetch/request, FPM hot read
carbon_model_objectModel with Carbon propertiesDummy model objects with three Carbon properties: createdAt, updatedAt, and publishedAt.Mutates fetched copy: noCLI repeated read, CLI store, FPM one fetch/request, FPM hot read
bulk_read_32_keysBulk Read: 32 KeysUses the multi-key config payload, primes 32 keys before timing, then repeatedly fetches all keys as a batch. UserCache is measured with fetchMultiple() and with a per-key fetch() loop; APCu is measured with apcu_fetch(array) and with a per-key loop.Measured batches per iteration: 2000Bulk read
bulk_read_128_keysBulk Read: 128 KeysUses the multi-key config payload, primes 128 keys before timing, then repeatedly fetches all keys as a batch. UserCache is measured with fetchMultiple() and with a per-key fetch() loop; APCu is measured with apcu_fetch(array) and with a per-key loop.Measured batches per iteration: 800Bulk read

Notes

Already-resident data is a baseline

The resident table does not include UserCache store time. It compares direct access to an already-resident payload with fetching a previously stored UserCache entry and running the same access probe. The difference estimates fetch and materialization overhead after the value has already been stored. The primary comparison for UserCache is against APCu or ext-deepclone when reconstructing object-heavy payloads, not against literals already resident in the request.

Slower stores are an expected trade-off for faster reads

Store workloads are shown to make the write-side cost explicit. APCu-style shared caches are usually used for read-heavy paths, where a stored value is read many times. Store throughput is an intentional trade-off in this design, not the metric it is optimized for.