The PHP Bench
All runs

20260928011232-b9eaed5b

complete Signed by kaiju · 9f9bb07dedd6...91a4d3d3
Started
Generated
Measured samples
7,488
Combinations
52

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.

Min sample
3.47 ms
Mean sample
1,194 ms
Max sample
12,646 ms
Cumulative time
2h 29m 1s
Throughput
0.838/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. Doctrine 3.6.2 sqlite-file 132 ms
  9. Yii 2.0.54 sqlite-memory 144 ms
  10. DivergenceV3 3.2.0 sqlite-memory 145 ms
  11. RedBean 5.7.5 sqlite-memory 149 ms
  12. Cake 5.3.3 sqlite-memory 270 ms
  13. CakeCached 5.3.3 sqlite-memory 271 ms
  14. Cake 5.3.3 sqlite-file 315 ms
  15. CakeCached 5.3.3 sqlite-file 317 ms
  16. Eloquent 13.2.0 sqlite-memory 326 ms
  17. PHPFUIBatch 3.0.3 mariadb 627 ms
  18. Doctrine 3.6.2 mariadb 829 ms
  19. Cycle 2.16.0 postgresql 878 ms
  20. Cycle 2.16.0 mariadb 936 ms
  21. Atlas 2.0.1 mariadb 941 ms
  22. PHPFUIBatch 3.0.3 sqlite-file 958 ms
  23. PHPFUIBatch 3.0.3 postgresql 992 ms
  24. Doctrine 3.6.2 postgresql 1,029 ms
  25. PHPFUI 3.0.3 mariadb 1,050 ms
  26. Propel2 6cb272b6 mariadb 1,091 ms
  27. CakeCached 5.3.3 mariadb 1,168 ms
  28. DivergenceV2 2.1.4 mariadb 1,170 ms
  29. Cake 5.3.3 mariadb 1,187 ms
  30. DivergenceV3 3.2.0 mariadb 1,307 ms
  31. Propel2 6cb272b6 postgresql 1,308 ms
  32. Yii 2.0.54 mariadb 1,336 ms
  33. Atlas 2.0.1 postgresql 1,337 ms
  34. ActiveRecord 2.0.6 postgresql 1,487 ms
  35. PHPFUI 3.0.3 postgresql 1,561 ms
  36. ActiveRecord 2.0.6 sqlite-file 1,676 ms
  37. RedBean 5.7.5 mariadb 1,686 ms
  38. Yii 2.0.54 postgresql 1,856 ms
  39. DivergenceV3 3.2.0 postgresql 1,882 ms
  40. CakeCached 5.3.3 postgresql 1,956 ms
  41. Cake 5.3.3 postgresql 1,975 ms
  42. Atlas 2.0.1 sqlite-file 2,237 ms
  43. Eloquent 13.2.0 mariadb 2,242 ms
  44. Cycle 2.16.0 sqlite-file 2,242 ms
  45. PHPFUI 3.0.3 sqlite-file 2,318 ms
  46. Propel2 6cb272b6 sqlite-file 2,318 ms
  47. DivergenceV3 3.2.0 sqlite-file 2,374 ms
  48. Yii 2.0.54 sqlite-file 2,401 ms
  49. RedBean 5.7.5 sqlite-file 2,438 ms
  50. Eloquent 13.2.0 postgresql 2,477 ms
  51. Eloquent 13.2.0 sqlite-file 2,621 ms
  52. RedBean 5.7.5 postgresql 3,631 ms

Where the time goes

Each bar is one framework's mean scenario run, 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 52 combinations
Insert 24% Read 8% Update 44% Delete 22%

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

sqlite-file

  1. Doctrine3.6.2 132 ms
  2. Cake5.3.3 315 ms
  3. CakeCached5.3.3 317 ms
  4. PHPFUIBatch3.0.3 958 ms
  5. ActiveRecord2.0.6 1,676 ms
  6. Atlas2.0.1 2,237 ms
  7. Cycle2.16.0 2,242 ms
  8. PHPFUI3.0.3 2,318 ms
  9. Propel26cb272b6 2,318 ms
  10. DivergenceV33.2.0 2,374 ms
  11. Yii2.0.54 2,401 ms
  12. RedBean5.7.5 2,438 ms
  13. Eloquent13.2.0 2,621 ms

mariadb

  1. PHPFUIBatch3.0.3 627 ms
  2. Doctrine3.6.2 829 ms
  3. Cycle2.16.0 936 ms
  4. Atlas2.0.1 941 ms
  5. PHPFUI3.0.3 1,050 ms
  6. Propel26cb272b6 1,091 ms
  7. CakeCached5.3.3 1,168 ms
  8. DivergenceV22.1.4 1,170 ms
  9. Cake5.3.3 1,187 ms
  10. DivergenceV33.2.0 1,307 ms
  11. Yii2.0.54 1,336 ms
  12. RedBean5.7.5 1,686 ms
  13. Eloquent13.2.0 2,242 ms

postgresql

  1. Cycle2.16.0 878 ms
  2. PHPFUIBatch3.0.3 992 ms
  3. Doctrine3.6.2 1,029 ms
  4. Propel26cb272b6 1,308 ms
  5. Atlas2.0.1 1,337 ms
  6. ActiveRecord2.0.6 1,487 ms
  7. PHPFUI3.0.3 1,561 ms
  8. Yii2.0.54 1,856 ms
  9. DivergenceV33.2.0 1,882 ms
  10. CakeCached5.3.3 1,956 ms
  11. Cake5.3.3 1,975 ms
  12. Eloquent13.2.0 2,477 ms
  13. RedBean5.7.5 3,631 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
Doctrine 3.6.2 sqlite-file 144 132 ms 15.1 ms 25.5 ms 51.3 ms 22.1 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
Cake 5.3.3 sqlite-file 144 315 ms 76.5 ms 49.6 ms 151 ms 32.4 ms
CakeCached 5.3.3 sqlite-file 144 317 ms 77.2 ms 50.0 ms 152 ms 32.6 ms
Eloquent 13.2.0 sqlite-memory 144 326 ms 47.4 ms 46.1 ms 166 ms 52.8 ms
PHPFUIBatch 3.0.3 mariadb 144 627 ms 14.4 ms 95.1 ms 463 ms 52.5 ms
Doctrine 3.6.2 mariadb 144 829 ms 67.7 ms 147 ms 386 ms 209 ms
Cycle 2.16.0 postgresql 144 878 ms 229 ms 53.8 ms 343 ms 245 ms
Cycle 2.16.0 mariadb 144 936 ms 228 ms 70.2 ms 374 ms 257 ms
Atlas 2.0.1 mariadb 144 941 ms 232 ms 77.4 ms 373 ms 257 ms
PHPFUIBatch 3.0.3 sqlite-file 144 958 ms 12.8 ms 16.6 ms 913 ms 15.1 ms
PHPFUIBatch 3.0.3 postgresql 144 992 ms 16.8 ms 177 ms 670 ms 114 ms
Doctrine 3.6.2 postgresql 144 1,029 ms 94.4 ms 168 ms 466 ms 282 ms
PHPFUI 3.0.3 mariadb 144 1,050 ms 238 ms 92.4 ms 451 ms 266 ms
Propel2 6cb272b6 mariadb 144 1,091 ms 282 ms 15.2 ms 428 ms 361 ms
CakeCached 5.3.3 mariadb 144 1,168 ms 263 ms 198 ms 568 ms 134 ms
DivergenceV2 2.1.4 mariadb 144 1,170 ms 269 ms 111 ms 520 ms 267 ms
Cake 5.3.3 mariadb 144 1,187 ms 271 ms 202 ms 575 ms 133 ms
DivergenceV3 3.2.0 mariadb 144 1,307 ms 280 ms 154 ms 598 ms 273 ms
Propel2 6cb272b6 postgresql 144 1,308 ms 321 ms 15.4 ms 479 ms 475 ms
Yii 2.0.54 mariadb 144 1,336 ms 268 ms 135 ms 563 ms 366 ms
Atlas 2.0.1 postgresql 144 1,337 ms 291 ms 155 ms 517 ms 360 ms
ActiveRecord 2.0.6 postgresql 144 1,487 ms 372 ms 210 ms 759 ms 132 ms
PHPFUI 3.0.3 postgresql 144 1,561 ms 305 ms 184 ms 670 ms 388 ms
ActiveRecord 2.0.6 sqlite-file 144 1,676 ms 694 ms 25.5 ms 941 ms 14.5 ms
RedBean 5.7.5 mariadb 144 1,686 ms 471 ms 106 ms 772 ms 329 ms
Yii 2.0.54 postgresql 144 1,856 ms 340 ms 216 ms 777 ms 506 ms
DivergenceV3 3.2.0 postgresql 144 1,882 ms 403 ms 259 ms 824 ms 381 ms
CakeCached 5.3.3 postgresql 144 1,956 ms 484 ms 335 ms 912 ms 220 ms
Cake 5.3.3 postgresql 144 1,975 ms 484 ms 333 ms 931 ms 222 ms
Atlas 2.0.1 sqlite-file 144 2,237 ms 679 ms 13.0 ms 881 ms 664 ms
Eloquent 13.2.0 mariadb 144 2,242 ms 363 ms 273 ms 1,037 ms 552 ms
Cycle 2.16.0 sqlite-file 144 2,242 ms 688 ms 8.17 ms 875 ms 664 ms
PHPFUI 3.0.3 sqlite-file 144 2,318 ms 705 ms 16.7 ms 915 ms 680 ms
Propel2 6cb272b6 sqlite-file 144 2,318 ms 697 ms 7.84 ms 910 ms 700 ms
DivergenceV3 3.2.0 sqlite-file 144 2,374 ms 711 ms 28.9 ms 956 ms 677 ms
Yii 2.0.54 sqlite-file 144 2,401 ms 703 ms 30.6 ms 952 ms 712 ms
RedBean 5.7.5 sqlite-file 144 2,438 ms 736 ms 23.4 ms 970 ms 702 ms
Eloquent 13.2.0 postgresql 144 2,477 ms 390 ms 304 ms 1,116 ms 637 ms
Eloquent 13.2.0 sqlite-file 144 2,621 ms 743 ms 51.8 ms 1,065 ms 746 ms
RedBean 5.7.5 postgresql 144 3,631 ms 1,157 ms 193 ms 1,786 ms 488 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.