The PHP Bench
All runs

20260329203643-74505162

complete Signed by runner-20260329222123 · 409ffba3dd66...5ffbf106
Started
Generated
Measured samples
312
Combinations
52

Machine

Captured from the runner's system manifest.

Host eimu Linux · kernel 6.19.6
PHP 8.5.3
Processor AMD Ryzen 9 5950X 16-Core Processor 32 cores · x86_64
Memory 31.2 GB DIMM_A2 16 GiB 2666 MT/s DDR4 F4-4266C19-16GVK DIMM_B2 16 GiB 2666 MT/s DDR4 F4-4266C19-16GVK
Disk 3.5 TB Device: /dev/nvme0n1 Capacity: 3.5 TB

Runtime envelope

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

Min sample
5.42 ms
Mean sample
127 ms
Max sample
447 ms
Cumulative time
39.501s
Throughput
7.899/s

Runtime comparison

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

sqlite-memory

78 samples

  • Atlas 2.0.1 11.9 ms
  • PHPFUI 3.0.3 22.0 ms
  • Cycle 2.16.0 24.0 ms
  • PHPFUIBatch 3.0.3 24.7 ms
  • Propel2 6cb272b6 45.5 ms
  • ActiveRecord 2.0.6 46.5 ms
  • RedBean 5.7.5 54.9 ms
  • DivergenceV3 3.2.0 58.7 ms
  • Yii 2.0.54 61.4 ms
  • Doctrine 3.6.2 105 ms
  • CakeCached 5.3.3 128 ms
  • Cake 5.3.3 134 ms
  • Eloquent 13.2.0 192 ms
  • DivergenceV2 2.1.4 not run

sqlite-file

78 samples

  • Atlas 2.0.1 85.9 ms
  • Doctrine 3.6.2 101 ms
  • PHPFUIBatch 3.0.3 102 ms
  • Cycle 2.16.0 115 ms
  • ActiveRecord 2.0.6 119 ms
  • PHPFUI 3.0.3 123 ms
  • Propel2 6cb272b6 140 ms
  • CakeCached 5.3.3 147 ms
  • Cake 5.3.3 148 ms
  • Yii 2.0.54 151 ms
  • RedBean 5.7.5 160 ms
  • DivergenceV3 3.2.0 161 ms
  • Eloquent 13.2.0 297 ms
  • DivergenceV2 2.1.4 not run

mariadb

78 samples

  • Atlas 2.0.1 59.1 ms
  • PHPFUIBatch 3.0.3 72.1 ms
  • Cycle 2.16.0 72.9 ms
  • PHPFUI 3.0.3 76.7 ms
  • Propel2 6cb272b6 92.3 ms
  • DivergenceV2 2.1.4 99.3 ms
  • DivergenceV3 3.2.0 117 ms
  • Yii 2.0.54 125 ms
  • Doctrine 3.6.2 146 ms
  • RedBean 5.7.5 149 ms
  • Cake 5.3.3 174 ms
  • CakeCached 5.3.3 177 ms
  • Eloquent 13.2.0 291 ms
  • ActiveRecord 2.0.6 not run

postgresql

78 samples

  • Cycle 2.16.0 60.9 ms
  • Atlas 2.0.1 87.1 ms
  • Propel2 6cb272b6 110 ms
  • PHPFUIBatch 3.0.3 113 ms
  • PHPFUI 3.0.3 114 ms
  • Doctrine 3.6.2 142 ms
  • ActiveRecord 2.0.6 145 ms
  • DivergenceV3 3.2.0 165 ms
  • Yii 2.0.54 176 ms
  • CakeCached 5.3.3 239 ms
  • Cake 5.3.3 241 ms
  • RedBean 5.7.5 274 ms
  • Eloquent 13.2.0 307 ms
  • DivergenceV2 2.1.4 not run

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
Init 17% Insert 17% Read 13% Update 48%

sqlite-memory

  1. Atlas2.0.1 11.9 ms
  2. PHPFUI3.0.3 22.0 ms
  3. Cycle2.16.0 24.0 ms
  4. PHPFUIBatch3.0.3 24.7 ms
  5. Propel26cb272b6 45.5 ms
  6. ActiveRecord2.0.6 46.5 ms
  7. RedBean5.7.5 54.9 ms
  8. DivergenceV33.2.0 58.7 ms
  9. Yii2.0.54 61.4 ms
  10. Doctrine3.6.2 105 ms
  11. CakeCached5.3.3 128 ms
  12. Cake5.3.3 134 ms
  13. Eloquent13.2.0 192 ms

sqlite-file

  1. Atlas2.0.1 85.9 ms
  2. Doctrine3.6.2 101 ms
  3. PHPFUIBatch3.0.3 102 ms
  4. Cycle2.16.0 115 ms
  5. ActiveRecord2.0.6 119 ms
  6. PHPFUI3.0.3 123 ms
  7. Propel26cb272b6 140 ms
  8. CakeCached5.3.3 147 ms
  9. Cake5.3.3 148 ms
  10. Yii2.0.54 151 ms
  11. RedBean5.7.5 160 ms
  12. DivergenceV33.2.0 161 ms
  13. Eloquent13.2.0 297 ms

mariadb

  1. Atlas2.0.1 59.1 ms
  2. PHPFUIBatch3.0.3 72.1 ms
  3. Cycle2.16.0 72.9 ms
  4. PHPFUI3.0.3 76.7 ms
  5. Propel26cb272b6 92.3 ms
  6. DivergenceV22.1.4 99.3 ms
  7. DivergenceV33.2.0 117 ms
  8. Yii2.0.54 125 ms
  9. Doctrine3.6.2 146 ms
  10. RedBean5.7.5 149 ms
  11. Cake5.3.3 174 ms
  12. CakeCached5.3.3 177 ms
  13. Eloquent13.2.0 291 ms

postgresql

  1. Cycle2.16.0 60.9 ms
  2. Atlas2.0.1 87.1 ms
  3. Propel26cb272b6 110 ms
  4. PHPFUIBatch3.0.3 113 ms
  5. PHPFUI3.0.3 114 ms
  6. Doctrine3.6.2 142 ms
  7. ActiveRecord2.0.6 145 ms
  8. DivergenceV33.2.0 165 ms
  9. Yii2.0.54 176 ms
  10. CakeCached5.3.3 239 ms
  11. Cake5.3.3 241 ms
  12. RedBean5.7.5 274 ms
  13. Eloquent13.2.0 307 ms
Exact numbers
Atlas 2.0.1 sqlite-memory 6 11.9 ms 1.17 ms 3.42 ms 5.67 ms 0.23 ms
PHPFUI 3.0.3 sqlite-memory 6 22.0 ms 4.22 ms 5.35 ms 9.64 ms 0.65 ms
Cycle 2.16.0 sqlite-memory 6 24.0 ms 1.01 ms 3.03 ms 4.25 ms 0.16 ms
PHPFUIBatch 3.0.3 sqlite-memory 6 24.7 ms 6.16 ms 5.03 ms 10.0 ms 1.34 ms
Propel2 6cb272b6 sqlite-memory 6 45.5 ms 7.34 ms 11.5 ms 18.2 ms 1.82 ms
ActiveRecord 2.0.6 sqlite-memory 6 46.5 ms 10.5 ms 9.81 ms 23.1 ms 0.83 ms
RedBean 5.7.5 sqlite-memory 6 54.9 ms 7.08 ms 5.68 ms 22.8 ms 1.53 ms
DivergenceV3 3.2.0 sqlite-memory 6 58.7 ms 11.1 ms 13.9 ms 30.2 ms 1.22 ms
Atlas 2.0.1 mariadb 6 59.1 ms 5.48 ms 11.2 ms 35.0 ms 5.48 ms
Cycle 2.16.0 postgresql 6 60.9 ms 5.19 ms 9.49 ms 26.6 ms 4.47 ms
Yii 2.0.54 sqlite-memory 6 61.4 ms 10.7 ms 16.2 ms 22.5 ms 2.32 ms
PHPFUIBatch 3.0.3 mariadb 6 72.1 ms 7.55 ms 12.3 ms 46.4 ms 3.09 ms
Cycle 2.16.0 mariadb 6 72.9 ms 5.78 ms 11.2 ms 35.6 ms 5.94 ms
PHPFUI 3.0.3 mariadb 6 76.7 ms 8.87 ms 12.6 ms 46.4 ms 6.08 ms
Atlas 2.0.1 sqlite-file 6 85.9 ms 11.7 ms 4.78 ms 58.0 ms 10.1 ms
Atlas 2.0.1 postgresql 6 87.1 ms 6.56 ms 18.2 ms 47.3 ms 7.39 ms
Propel2 6cb272b6 mariadb 6 92.3 ms 14.1 ms 12.7 ms 48.8 ms 9.51 ms
DivergenceV2 2.1.4 mariadb 6 99.3 ms 13.4 ms 16.6 ms 61.4 ms 5.90 ms
Doctrine 3.6.2 sqlite-file 6 101 ms 21.8 ms 16.9 ms 17.6 ms 1.38 ms
PHPFUIBatch 3.0.3 sqlite-file 6 102 ms 8.22 ms 5.85 ms 82.8 ms 2.72 ms
Doctrine 3.6.2 sqlite-memory 6 105 ms 22.6 ms 17.1 ms 18.6 ms 1.58 ms
Propel2 6cb272b6 postgresql 6 110 ms 14.2 ms 14.9 ms 55.3 ms 13.1 ms
PHPFUIBatch 3.0.3 postgresql 6 113 ms 7.87 ms 20.7 ms 70.1 ms 5.21 ms
PHPFUI 3.0.3 postgresql 6 114 ms 9.54 ms 21.0 ms 67.0 ms 8.44 ms
Cycle 2.16.0 sqlite-file 6 115 ms 14.2 ms 4.84 ms 69.5 ms 12.7 ms
DivergenceV3 3.2.0 mariadb 6 117 ms 15.6 ms 22.8 ms 69.8 ms 6.57 ms
ActiveRecord 2.0.6 sqlite-file 6 119 ms 22.6 ms 12.2 ms 80.0 ms 2.03 ms
PHPFUI 3.0.3 sqlite-file 6 123 ms 17.8 ms 6.53 ms 81.9 ms 14.4 ms
Yii 2.0.54 mariadb 6 125 ms 18.6 ms 25.9 ms 60.8 ms 9.57 ms
CakeCached 5.3.3 sqlite-memory 6 128 ms 45.4 ms 17.8 ms 48.5 ms 3.30 ms
Cake 5.3.3 sqlite-memory 6 134 ms 48.7 ms 19.0 ms 49.3 ms 3.31 ms
Propel2 6cb272b6 sqlite-file 6 140 ms 21.8 ms 12.0 ms 84.2 ms 14.9 ms
Doctrine 3.6.2 postgresql 6 142 ms 26.7 ms 25.5 ms 40.8 ms 5.01 ms
ActiveRecord 2.0.6 postgresql 6 145 ms 20.5 ms 26.8 ms 83.9 ms 4.41 ms
Doctrine 3.6.2 mariadb 6 146 ms 26.8 ms 26.9 ms 41.3 ms 4.84 ms
CakeCached 5.3.3 sqlite-file 6 147 ms 48.1 ms 19.8 ms 60.3 ms 5.32 ms
Cake 5.3.3 sqlite-file 6 148 ms 49.3 ms 20.2 ms 60.2 ms 4.63 ms
RedBean 5.7.5 mariadb 6 149 ms 19.6 ms 7.55 ms 96.4 ms 8.74 ms
Yii 2.0.54 sqlite-file 6 151 ms 24.7 ms 18.3 ms 85.5 ms 13.0 ms
RedBean 5.7.5 sqlite-file 6 160 ms 22.6 ms 6.87 ms 97.6 ms 15.5 ms
DivergenceV3 3.2.0 sqlite-file 6 161 ms 25.5 ms 15.3 ms 104 ms 13.9 ms
DivergenceV3 3.2.0 postgresql 6 165 ms 19.8 ms 32.6 ms 94.9 ms 8.40 ms
Cake 5.3.3 mariadb 6 174 ms 53.2 ms 26.0 ms 76.8 ms 5.65 ms
Yii 2.0.54 postgresql 6 176 ms 26.9 ms 34.3 ms 85.5 ms 13.1 ms
CakeCached 5.3.3 mariadb 6 177 ms 54.5 ms 26.8 ms 76.6 ms 5.72 ms
Eloquent 13.2.0 sqlite-memory 6 192 ms 37.6 ms 22.4 ms 88.6 ms 4.85 ms
CakeCached 5.3.3 postgresql 6 239 ms 73.3 ms 36.6 ms 108 ms 7.35 ms
Cake 5.3.3 postgresql 6 241 ms 68.3 ms 38.3 ms 112 ms 7.68 ms
RedBean 5.7.5 postgresql 6 274 ms 39.3 ms 9.84 ms 195 ms 12.1 ms
Eloquent 13.2.0 mariadb 6 291 ms 46.4 ms 38.6 ms 148 ms 16.5 ms
Eloquent 13.2.0 sqlite-file 6 297 ms 52.5 ms 23.9 ms 163 ms 18.2 ms
Eloquent 13.2.0 postgresql 6 307 ms 46.7 ms 41.4 ms 155 ms 17.0 ms

Scenario families

Mean across every framework and engine in this upload.

  • simple 99.7 ms
  • string_fixed 119 ms
  • string_variable 122 ms
  • int_fixed 124 ms
  • float_fixed 141 ms
  • canary 154 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.