3v4l.org

run code in 300+ PHP versions simultaneously
<?php declare(strict_types=1); namespace Repro; class CycleValue { public static bool $shutdown = false; private $value; private ?\stdClass $cycleRef; public function __construct($value) { $this->value = $value; // make self cyclically referenced to require GC run to be released $this->cycleRef = new \stdClass(); $this->cycleRef->x = $this; } public function __destruct() { if (!CycleValue::$shutdown) { // recreate self - prevent value to be effectively released until self::$shutdown is set new self($this->value); } } } $refs = []; for ($i = 1; $i <= 3_200; $i++) { $v = new \stdClass(); $v->i = $i; $refs[] = [ \WeakReference::create(new CycleValue($v)), \WeakReference::create($v), ]; if (($i % 100) === 0) { gc_collect_cycles(); if (PHP_VERSION_ID < 80100) { gc_collect_cycles(); } if ($i >= 2_500) { echo count($refs) . ', peak: ' . round(memory_get_peak_usage(true) / (1024 * 1024), 2) . ' MiB, GC runs: ' . (gc_status()['runs'] - $gcRuns) . ', time: ' . round(microtime(true) - $t, 2) . " s \n"; } foreach ($refs as [$rCycle, $rV]) { if ($rCycle->get() !== null) { throw new \Error('CycleValue not released'); } elseif ($rV->get() === null) { throw new \Error('Object released'); } } $t = microtime(true); $gcRuns = gc_status()['runs']; } } CycleValue::$shutdown = true; unset($v); gc_collect_cycles(); if (PHP_VERSION_ID < 80100) { gc_collect_cycles(); } foreach ($refs as [$rCycle, $rV]) { if ($rCycle->get() !== null) { throw new \Error('Shutdown: CycleValue not released'); } elseif ($rV->get() !== null) { throw new \Error('Shutdown: Object not released'); } } echo "done\n";

Here you find the average performance (time & memory) of each version. A grayed out version indicates it didn't complete successfully (based on exit-code).

VersionSystem time (s)User time (s)Memory (MiB)
8.3.70.0400.30323.68
8.3.60.0200.29923.88
8.3.50.0100.28424.20
8.3.40.0270.32524.88
8.3.30.0140.37826.04
8.3.20.0170.38927.45
8.3.10.0210.36627.57
8.3.00.0170.37725.96
8.2.190.0250.24423.75
8.2.180.0220.28623.69
8.2.170.0230.25124.94
8.2.160.0180.31226.63
8.2.150.0210.31426.21
8.2.140.0210.32126.88
8.2.130.0200.30926.90
8.2.120.0170.28226.04
8.2.110.0190.27526.14
8.2.100.0210.27325.96
8.2.90.0170.28225.86
8.2.80.0230.27325.94
8.2.70.0250.28625.80
8.2.60.0230.27925.83
8.2.50.0210.27525.91
8.2.40.0180.30225.76
8.2.30.0190.27825.85
8.2.20.0250.27325.75
8.2.10.0220.27125.67
8.2.00.0190.26925.64
8.1.280.0220.26323.80
8.1.270.0240.32428.19
8.1.260.0210.32928.24
8.1.250.0250.29228.21
8.1.240.0200.31026.19
8.1.230.0190.30326.17
8.1.220.0210.30926.32
8.1.210.0180.31526.08
8.1.200.0160.30726.61
8.1.190.0170.31026.08
8.1.180.0210.30326.30
8.1.170.0210.30326.24
8.1.160.0210.31026.11
8.1.150.0220.30626.18
8.1.140.0190.30326.10
8.1.130.0210.30826.17
8.1.120.0220.30026.47
8.1.110.0220.31525.97
8.1.100.0170.30527.13
8.1.90.0210.31026.05
8.1.80.0160.30526.70
8.1.70.0110.31126.65
8.1.60.0180.30726.21
8.1.50.0220.31126.05
8.1.40.0210.31026.21
8.1.30.0190.31326.42
8.1.20.0210.30626.88
8.1.10.0190.30526.16
8.1.00.0200.30526.17

preferences:
31.89 ms | 475 KiB | 5 Q