3v4l.org

run code in 300+ PHP versions simultaneously
<?php // Proposal idea of enabling the unrolling in the userland. function measure(string $label, callable $fn): void { $start = hrtime(true); $result = $fn(); $end = hrtime(true); $elapsed = ($end - $start) / 1e9; echo "Sum: {$result}, {$label}: " . number_format($elapsed, 6) . " seconds\n"; } $array = range(1, 1e6); $n = count($array); measure("Normal for loop", function () use ($array, $n) { $sum = 0; for ($i = 0; $i < $n; $i++) { $sum += $array[$i]; } return $sum; }); // Sum: 500000500000, Normal for loop: 0.047172 seconds measure("Manual Unrolled x4", function () use ($array, $n) { $sum = 0; for ($i = 0; $i < $n; $i += 4) { $sum += $array[$i] + $array[$i + 1] + $array[$i + 2] + $array[$i + 3]; } return $sum; }); // Sum: 500000500000, Manual Unrolled x4: 0.042200 seconds measure("Manual Unrolled x8", function () use ($array, $n) { $sum = 0; for ($i = 0; $i < $n; $i += 8) { $sum += $array[$i] + $array[$i + 1] + $array[$i + 2] + $array[$i + 3] + $array[$i + 4] + $array[$i + 5] + $array[$i + 6] + $array[$i + 7]; } return $sum; }); // Sum: 500000500000, Manual Unrolled x8: 0.036472 seconds // Attributed Unroll - this is handled by your modified compiler measure("Attributed Unrolled #[Unroll(4)]", function () use ($array, $n) { $sum = 0; // @TODO: KhaledAlam: Unrolling logic of zend_compile_for( ) // #[Unroll(4)] for ($i = 0; $i < $n; $i++) { $sum += $array[$i]; } return $sum; }); // Sum: 0, Attributed Unrolled #[Unroll(4)]: 0.000002 seconds

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.4.120.0340.03439.41
8.4.110.0210.04337.35
8.4.100.0420.03833.80
8.4.90.0240.02935.71
8.4.80.0270.03332.95
8.4.70.0220.03632.68
8.4.60.0230.03132.97
8.4.50.0230.03132.84
8.4.40.0220.03432.73
8.4.30.0210.03432.83
8.4.20.0250.02932.85
8.4.10.0220.03232.58
8.3.250.0260.04234.14
8.3.240.0300.04632.44
8.3.230.0140.03431.81
8.3.220.0210.03531.78
8.3.210.0220.03331.74
8.3.200.0230.03231.67
8.3.190.0220.03331.65
8.3.180.0210.03531.73
8.3.170.0250.03131.66
8.3.160.0230.03031.83
8.3.150.0230.03131.76
8.3.140.0220.03431.87
8.3.130.0230.03131.81
8.3.120.0210.03131.87
8.3.110.0220.03231.81
8.3.100.0230.03031.61
8.3.90.0210.03431.79
8.3.80.0250.03231.87
8.3.70.0230.03231.75
8.3.60.0250.03231.69
8.3.50.0250.03132.37
8.3.40.0240.03232.73
8.3.30.0210.03332.80
8.3.20.0210.03532.80
8.3.10.0190.03232.83
8.3.00.0260.03232.75
8.2.290.0220.03631.70
8.2.280.0210.03131.74
8.2.270.0220.03231.76
8.2.260.0220.02931.66
8.2.250.0230.02931.65
8.2.240.0210.02931.54
8.2.230.0200.03231.49
8.2.220.0200.03131.74
8.2.210.0230.03031.68
8.2.200.0210.03131.76
8.2.190.0240.02831.57
8.2.180.0230.02831.82
8.2.170.0220.03132.84
8.2.160.0260.02832.90
8.2.150.0250.03032.93
8.2.140.0250.02732.85
8.2.130.0240.03232.84
8.2.120.0240.03332.85
8.2.110.0210.03232.73
8.2.100.0220.03032.84
8.2.90.0260.03132.92
8.2.80.0250.02932.78
8.2.70.0240.03032.85
8.2.60.0230.03132.96
8.2.50.0230.03032.74
8.2.40.0260.03432.86
8.2.30.0280.03732.79
8.2.20.0240.02932.75
8.2.10.0240.02832.77
8.2.00.0220.03032.81

preferences:
33.77 ms | 403 KiB | 5 Q