3v4l.org

run code in 500+ PHP versions simultaneously
<?php /** * @psalm-immutable * @template-covariant TValue */ abstract class Option { /** * @template T * @param list<Option<T>> $options * @return Option<list<T>> */ public static function all(array $options): Option { return array_reduce( $options, /** * @param Option<list<T>> $carry * @param Option<T> $o * @return Option<list<T>> */ fn(Option $carry, Option $o) => $carry->flatMap( /** * @param list<T> $ts * @return Option<list<T>> */ fn(array $ts) => $o instanceof None ? new Some($ts) : $o->map( /** * @param T $t * @return list<T> */ fn($t) => array_merge($ts, [ $t ]) ) ), new Some([]), ); } /** * @template TMap * @param callable(TValue):TMap $map * @return Option<TMap> */ abstract public function map(callable $map): Option; /** * @template TMap * @param callable(TValue):Option<TMap> $map * @return Option<TMap> */ abstract public function flatMap(callable $map): Option; } /** * @psalm-immutable * @template-covariant T * @template-extends Option<T> */ final class Some extends Option { /** @var T */ private $value; /** @param T $value */ public function __construct($value) { $this->value = $value; } public function map(callable $map): Option { /** @psalm-suppress ImpureFunctionCall */ return new Some($map($this->value)); } public function flatMap(callable $map): Option { /** @psalm-suppress ImpureFunctionCall */ return $map($this->value); } } /** * @psalm-immutable * @template-extends Option<never> */ final class None extends Option { public function map(callable $map): Option { return $this; } public function flatMap(callable $map): Option { return $this; } } $opts = [new Some(1), new None(), new Some(2), new None(), new None(), new Some(3)]; var_dump(Option::all($opts));

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.5.30.0090.00819.05
8.5.20.0110.00621.16
8.5.10.0110.00920.10
8.5.00.0120.00824.59
8.4.180.0160.00719.60
8.4.170.0130.00923.82
8.4.160.0040.00723.93
8.4.150.0070.00616.81
8.4.140.0110.01017.34
8.4.130.0130.00717.65
8.4.120.0130.00820.74
8.4.110.0110.01118.84
8.4.100.0100.01117.76
8.4.90.0150.00417.70
8.4.80.0110.00820.76
8.4.70.0120.00917.70
8.4.60.0120.00917.45
8.4.50.0100.00918.68
8.4.40.0070.00318.92
8.4.30.0090.00620.54
8.4.20.0070.01418.04
8.4.10.0060.00322.23
8.3.300.0160.00522.86
8.3.290.0120.00822.59
8.3.280.0100.01018.52
8.3.270.0110.00916.80
8.3.260.0100.00916.60
8.3.250.0120.00819.02
8.3.240.0090.01016.64
8.3.230.0120.00816.57
8.3.220.0110.00816.88
8.3.210.0140.00616.75
8.3.200.0150.00616.55
8.3.190.0120.00718.64
8.3.180.0110.00816.75
8.3.170.0120.00618.96
8.3.160.0000.00820.27
8.3.150.0120.00616.73
8.3.140.0030.00618.99
8.3.130.0060.00916.56
8.3.120.0080.00020.87
8.3.110.0090.00018.43
8.3.100.0070.00316.75
8.3.90.0070.01026.77
8.3.80.0030.00618.56
8.3.70.0110.00416.75
8.3.60.0070.01118.43
8.3.50.0150.00418.44
8.3.40.0070.00721.64
8.3.30.0130.00318.84
8.3.20.0000.00824.18
8.3.10.0080.00024.66
8.3.00.0040.00426.16
8.2.300.0100.01017.96
8.2.290.0100.00820.25
8.2.280.0090.01016.74
8.2.270.0060.00317.23
8.2.260.0160.00316.44
8.2.250.0060.00318.28
8.2.240.0040.00417.30
8.2.230.0050.00320.94
8.2.220.0040.00424.06
8.2.210.0100.01026.77
8.2.200.0090.00016.88
8.2.190.0150.00716.75
8.2.180.0070.01425.92
8.2.170.0180.00318.83
8.2.160.0070.00722.96
8.2.150.0000.00825.66
8.2.140.0040.00424.66
8.2.130.0060.00326.16
8.2.120.0040.00426.16
8.2.110.0070.00320.88
8.2.100.0060.00619.70
8.2.90.0030.00619.17
8.2.80.0050.00318.03
8.2.70.0000.00817.63
8.2.60.0030.00617.93
8.2.50.0060.00318.07
8.2.40.0000.01118.16
8.2.30.0000.00818.16
8.2.20.0040.00420.51
8.2.10.0070.00018.14
8.2.00.0030.00619.38
8.1.340.0070.00220.02
8.1.330.0090.00916.80
8.1.320.0120.00816.04
8.1.310.0040.00418.39
8.1.300.0130.00718.00
8.1.290.0050.00530.84
8.1.280.0140.00325.92
8.1.270.0070.00323.99
8.1.260.0000.00826.35
8.1.250.0090.00028.09
8.1.240.0070.00320.88
8.1.230.0050.00522.25
8.1.220.0040.00417.77
8.1.210.0000.00818.77
8.1.200.0050.00517.36
8.1.190.0080.00017.35
8.1.180.0040.00418.10
8.1.170.0030.00518.66
8.1.160.0000.00718.96
8.1.150.0050.00318.67
8.1.140.0040.00417.35
8.1.130.0070.00017.48
8.1.120.0070.00017.56
8.1.110.0040.00417.39
8.1.100.0000.00717.50
8.1.90.0040.00417.51
8.1.80.0080.00317.38
8.1.70.0100.00617.42
8.1.60.0060.01217.52
8.1.50.0140.00217.51
8.1.40.0120.00617.42
8.1.30.0150.00317.65
8.1.20.0180.00017.57
8.1.10.0170.00017.60
8.1.00.0040.01317.55
8.0.300.0030.00618.77
8.0.290.0080.00416.75
8.0.280.0070.00018.43
8.0.270.0040.00417.98
8.0.260.0000.00716.93
8.0.250.0070.00017.07
8.0.240.0070.00016.96
8.0.230.0030.00317.05
8.0.220.0030.00316.95
8.0.210.0110.00416.91
8.0.200.0160.00016.86
8.0.190.0070.00716.83
8.0.180.0110.00416.94
8.0.170.0090.00616.95
8.0.160.0100.00316.94
8.0.150.0090.00616.79
8.0.140.0140.00016.89
8.0.130.0110.00516.92
8.0.120.0120.00417.02
8.0.110.0070.00716.89
8.0.100.0150.00016.98
8.0.90.0070.00816.98
8.0.80.0120.00416.93
8.0.70.0120.00316.92
8.0.60.0040.00716.86
8.0.50.0120.00217.02
8.0.30.0130.00016.94
8.0.20.0140.00016.88
8.0.10.0060.00517.02
7.4.330.0000.00515.55
7.4.320.0040.00416.55
7.4.300.0000.00816.53
7.4.290.0100.00316.59
7.4.280.0110.00516.48
7.4.270.0110.00616.53
7.4.260.0110.00616.52
7.4.250.0170.00016.48
7.4.240.0050.00916.43
7.4.230.0070.00316.24
7.4.220.0110.00016.36
7.4.210.0070.00416.43
7.4.200.0100.00016.53
7.4.190.0070.00416.49
7.4.180.0030.00716.30
7.4.160.0040.00716.48
7.4.150.0030.00616.49
7.4.140.0050.00516.34
7.4.130.0040.00816.50
7.4.120.0090.00316.41
7.4.110.0050.00516.41
7.4.100.0070.00416.21
7.4.90.0050.00515.99
7.4.80.0070.00416.50
7.4.70.0100.00016.28
7.4.60.0070.00316.46
7.4.50.0100.00016.25
7.4.40.0070.00316.08
7.4.30.0070.00316.02
7.4.20.0050.00516.05
7.4.10.0060.00316.53
7.4.00.0040.00816.51

preferences:
52.33 ms | 1286 KiB | 5 Q