The PHP Bench
All runs

20260928011232-b9eaed5b

complete Signed by kaiju · 9f9bb07dedd6...91a4d3d3
Started
Generated
Measured samples
1,872
Combinations
13

Machine

Captured from the runner's system manifest.

Host kaiju Linux · kernel 6.19.8-200.nobara.fc43.x86_64
PHP 8.5.11
Processor Intel(R) Xeon(R) CPU E5-2687W v4 @ 3.00GHz 48 cores · x86_64
Memory 251.7 GB P1_DIMMA1 32 GB 2133 MT/s DDR4 M386A4G40DM0-CPB P1_DIMMB1 32 GB 2133 MT/s DDR4 M386A4G40DM0-CPB P1_DIMMC1 32 GB 2133 MT/s DDR4 M386A4G40DM0-CPB P1_DIMMD1 32 GB 2133 MT/s DDR4 M386A4G40DM0-CPB P2_DIMME1 32 GB 2133 MT/s DDR4 M386A4G40DM0-CPB P2_DIMMF1 32 GB 2133 MT/s DDR4 M386A4G40DM0-CPB P2_DIMMG1 32 GB 2133 MT/s DDR4 M386A4G40DM0-CPB P2_DIMMH1 32 GB 2133 MT/s DDR4 M386A4G40DM0-CPB
Disk 447.1 GB Device: /dev/sda Capacity: 447.1 GB

Runtime envelope

End-to-end time per scenario run across all non-warmup samples on sqlite-memory.

Min sample
3.47 ms
Mean sample
139 ms
Max sample
1,223 ms
Cumulative time
4m 20s
Throughput
7.213/s

Runtime comparison

Mean time per scenario run in this upload, warmup runs excluded, sorted by runtime.

Init Insert Read Update Delete
  1. Cycle 2.16.0 sqlite-memory 27.7 ms
  2. Atlas 2.0.1 sqlite-memory 38.0 ms
  3. PHPFUIBatch 3.0.3 sqlite-memory 54.2 ms
  4. PHPFUI 3.0.3 sqlite-memory 61.4 ms
  5. Propel2 6cb272b6 sqlite-memory 83.0 ms
  6. ActiveRecord 2.0.6 sqlite-memory 103 ms
  7. Doctrine 3.6.2 sqlite-memory 130 ms
  8. Yii 2.0.54 sqlite-memory 144 ms
  9. DivergenceV3 3.2.0 sqlite-memory 145 ms
  10. RedBean 5.7.5 sqlite-memory 149 ms
  11. Cake 5.3.3 sqlite-memory 270 ms
  12. CakeCached 5.3.3 sqlite-memory 271 ms
  13. Eloquent 13.2.0 sqlite-memory 326 ms

Where the time goes

Each bar is one framework's mean scenario run on sqlite-memory, split into its phases and sorted by total. Bars share a scale within each engine. Hover a bar for the numbers.

Init Insert Read Update Delete
Mean split across 13 combinations
Insert 20% Read 16% Update 47% Delete 13%

sqlite-memory

  1. Cycle2.16.0 27.7 ms
  2. Atlas2.0.1 38.0 ms
  3. PHPFUIBatch3.0.3 54.2 ms
  4. PHPFUI3.0.3 61.4 ms
  5. Propel26cb272b6 83.0 ms
  6. ActiveRecord2.0.6 103 ms
  7. Doctrine3.6.2 130 ms
  8. Yii2.0.54 144 ms
  9. DivergenceV33.2.0 145 ms
  10. RedBean5.7.5 149 ms
  11. Cake5.3.3 270 ms
  12. CakeCached5.3.3 271 ms
  13. Eloquent13.2.0 326 ms
Exact numbers
Cycle 2.16.0 sqlite-memory 144 27.7 ms 4.34 ms 4.88 ms 10.00 ms 1.93 ms
Atlas 2.0.1 sqlite-memory 144 38.0 ms 7.02 ms 8.50 ms 17.3 ms 4.52 ms
PHPFUIBatch 3.0.3 sqlite-memory 144 54.2 ms 6.03 ms 11.8 ms 30.8 ms 4.63 ms
PHPFUI 3.0.3 sqlite-memory 144 61.4 ms 10.5 ms 11.8 ms 30.5 ms 7.66 ms
Propel2 6cb272b6 sqlite-memory 144 83.0 ms 13.5 ms 7.10 ms 37.6 ms 21.2 ms
ActiveRecord 2.0.6 sqlite-memory 144 103 ms 20.6 ms 19.7 ms 54.9 ms 6.38 ms
Doctrine 3.6.2 sqlite-memory 144 130 ms 15.0 ms 25.5 ms 50.7 ms 21.7 ms
Yii 2.0.54 sqlite-memory 144 144 ms 23.4 ms 24.3 ms 63.2 ms 29.7 ms
DivergenceV3 3.2.0 sqlite-memory 144 145 ms 30.9 ms 28.3 ms 75.5 ms 8.78 ms
RedBean 5.7.5 sqlite-memory 144 149 ms 33.6 ms 18.2 ms 68.7 ms 21.8 ms
Cake 5.3.3 sqlite-memory 144 270 ms 73.1 ms 45.1 ms 122 ms 24.5 ms
CakeCached 5.3.3 sqlite-memory 144 271 ms 73.0 ms 45.1 ms 122 ms 24.6 ms
Eloquent 13.2.0 sqlite-memory 144 326 ms 47.4 ms 46.1 ms 166 ms 52.8 ms

Scenario families

Mean across every framework and engine in this upload.

  • simple 178 ms
  • string_variable 1,076 ms
  • string_fixed 1,108 ms
  • float_fixed 1,283 ms
  • int_fixed 1,296 ms
  • canary 1,546 ms

What the workloads measure

The row shape and operation mix decide where each framework spends its time.

Scenario families
simple baseline row shape
Shows framework overhead with minimal field complexity, so object creation and query setup dominate.
canary mixed field and nullable stress
Wide mixed records amplify casting, hydration, dirty tracking, and adapter metadata overhead.
int_fixed pure scalar writes
A low-noise floor. Slow results here usually mean framework machinery is expensive even before text and cast-heavy payloads show up.
float_fixed numeric conversion paths
Decimal and float normalization can widen update and verification cost, especially for ORMs that compare serialized values.
string_fixed predictable text hydration
Column count and text assignment matter more than payload variability, which makes hydration strategy easier to isolate.
string_variable application-like text workload
Variable strings and note fields make this the closest to real CRUD traffic and usually punish heavier active-record layers the most.
Operation shapes
Warmup vs hot runs
Run 1 is warmup. Hot-path averages exclude it so boot and metadata setup do not dominate steady-state rankings.
Insert and indexed schemas
Indexed tables make writes cost more because every insert and many updates must maintain secondary indexes as well as the row itself.
Read all vs read probes
Read All rewards bulk hydration efficiency; random and tail probes expose per-query setup, lookup overhead, and tiny-result inefficiency.
Update with verification
Each update shape is followed by a verification read, so dirty-checking, write SQL generation, hydration, and comparison all affect the final time.
Delete with confirmation
Deletes are checked afterward. Frameworks that pay extra for follow-up lookups or teardown lose more time here than a bare SQL path.
Total runtime
The total runtime metric is effectively a benchmark of the machine plus adapter behavior across the full workload, not just one CRUD verb.