3v4l.org

run code in 300+ PHP versions simultaneously
<?php error_reporting(E_ALL); ini_set('display_startup_errors', 1); ini_set('display_errors', 1); function getFillNotion(\DateTimeImmutable $fillStart, \DateTimeImmutable $fillEnd, \DateTimeInterface $gapStart, \DateTimeInterface $gapEnd) { //$gapInterval = $gapStart->diff($gapEnd); // Doesn't work $gapInterval = new \DateInterval('PT'.($gapEnd->getTimestamp() - $gapStart->getTimestamp()).'S'); if($gapStart > $fillStart) { //The fill is older than the gap so make the fill's endTime match the gap's endTime $fillEndModified = $fillEnd ->modify('previous '.$gapEnd->format('D')) ->setTime(...explode('.', $gapEnd->format('H.i.s.u'))); if($fillEndModified->diff($fillEnd)->format('%a') >= 7) { $fillEndModified = $fillEndModified->add(new \DateInterval('P7D')); } $fillStartModified = $fillEndModified->sub($gapInterval); if($fillStartModified < $fillStart) { return []; } } else { //The fill is newer than the gap so make the fill's startTime match the gap's startTime $fillStartModified = $fillStart ->modify('next '.$gapStart->format('D')) ->setTime(...explode('.', $gapStart->format('H.i.s.u'))); if($fillStart->diff($fillStartModified)->format('%a') >= 7) { $fillStartModified = $fillStartModified->sub(new \DateInterval('P7D')); } $fillEndModified = $fillStartModified->add($gapInterval); if($fillEndModified > $fillEnd) { return []; } } return [$fillStartModified, $fillEndModified]; } function getFillRequinix(\DateTime $fillStart, \DateTime $fillEnd, \DateTime $gapStart, \DateTime $gapEnd) { // // being with the original start $fillStartModified = clone $fillStart; // move to the next weekday and time $wdtStart = $gapStart->format("l H:i:s"); if ($fillStartModified->format("l H:i:s") != $wdtStart) { $fillStartModified->modify("next {$wdtStart}"); } // get the duration, minus a bit so we can do a "next <day>" after $days = $gapStart->diff($gapEnd)->days - 1; // get the weekday and time $wdtEnd = $gapEnd->format("l H:i:s"); // update $fillEndModified = clone $fillStartModified; $fillEndModified->modify("+${days} days"); $fillEndModified->modify("next {$wdtEnd}"); return $fillStartModified < $fillStart || $fillEndModified > $fillEnd?[]:[$fillStartModified, $fillEndModified]; } function isDifferent(?DateTimeInterface $requinix, $notion) { if($requinix xor $notion) { return true; } elseif(!$requinix && !$notion) { return false; } else { return $requinix->getTimestamp() !== $notion->getTimestamp(); } } /* Fill Sunday 2019-02-17 08:09:53 -> Saturday 2019-04-06 19:09:48 Gap Sunday 2019-04-14 20:33:00 -> Tuesday 2019-05-28 10:05:28 */ $max = 800*24*60*60; $int = 80*24*60*60; $score = ['requinix'=>0, 'notion'=>0, 'tie'=>0, 'nofill'=>0]; for ($i = 0; $i < 10000; $i++) { $fillEnd = time()-rand(0, $max); $fillStart = $fillEnd-rand(0, $int); $gapEnd = time()-rand(0, $max); $gapStart = $gapEnd-rand(0, $int); $fillEnd = new DateTime("@$fillEnd"); $fillStart = new DateTime("@$fillStart"); $gapEnd = new DateTime("@$gapEnd"); $gapStart = new DateTime("@$gapStart"); $fillRequinix = getFillRequinix($fillStart, $fillEnd, $gapStart, $gapEnd); $fillNotion = getFillNotion(DateTimeImmutable::createFromMutable( $fillStart ), DateTimeImmutable::createFromMutable( $fillEnd ), $gapStart, $gapEnd); if($fillRequinix && $fillNotion) { $gapStartTimestamp = $gapStart->getTimestamp(); $fillRequinixOffset = abs($gapStartTimestamp - $fillRequinix[0]->getTimestamp()); $fillNotionOffset = abs($gapStartTimestamp - $fillNotion[0]->getTimestamp()); if($fillRequinixOffset === $fillNotionOffset) { $score['tie']++; } elseif($fillRequinixOffset<$fillNotionOffset) { $score['requinix']++; } else { $score['notion']++; } } elseif($fillRequinix) { $score['requinix']++; } elseif($fillNotion) { $score['notion']++; } else { $score['nofill']++; } } $score['total'] = array_sum($score); print_r($score);

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)
7.4.100.0160.30016.89
7.4.90.0090.40416.64
7.4.80.0120.30316.79
7.4.70.0200.30216.71
7.4.60.0060.29616.88
7.4.50.0160.31016.86
7.4.40.0130.32416.90
7.4.30.0070.31416.79
7.4.20.0090.32216.81
7.4.10.0060.31516.71
7.4.00.0060.31716.64
7.3.220.0160.32516.87
7.3.210.0130.31416.74
7.3.200.0090.29517.01
7.3.190.0100.30316.57
7.3.180.0090.33016.68
7.3.170.0130.30016.69
7.3.160.0160.30816.62
7.3.150.0160.30516.89
7.3.140.0070.30116.64
7.3.130.0070.30716.85
7.3.120.0190.30916.64
7.3.110.0170.28916.73
7.3.100.0130.29816.53
7.3.90.0160.34016.53
7.3.80.0070.50416.63
7.3.70.0190.30216.71
7.3.60.0130.31416.58
7.3.50.0070.35916.57
7.3.40.0130.31616.67
7.3.30.0190.29916.73
7.3.20.0160.29816.61
7.3.10.0100.32316.72
7.3.00.0750.31316.63
7.2.330.0160.31017.09
7.2.320.0180.35517.01
7.2.310.0070.31716.95
7.2.300.0130.30417.11
7.2.290.0100.35117.16
7.2.280.0130.38717.11
7.2.270.0100.31916.95
7.2.260.0030.30217.05
7.2.250.0070.32317.00
7.2.240.0070.29716.73
7.2.230.0130.30716.89
7.2.220.0000.32316.77
7.2.210.0150.34216.84
7.2.200.0160.32217.05
7.2.190.0030.31616.96
7.2.180.0160.31816.86
7.2.170.0130.33616.94
7.2.160.0170.33716.95
7.2.150.0100.32216.90
7.2.140.0160.30116.95
7.2.130.0100.31216.95
7.2.120.0130.36817.02
7.2.110.0160.31117.00
7.2.100.0160.30416.85
7.2.90.0100.31816.94
7.2.80.0070.52616.96
7.2.70.0170.45717.16
7.2.60.0160.37616.97
7.2.50.0190.35116.93
7.2.40.0060.34817.00
7.2.30.0160.52017.12
7.2.20.0070.34016.98
7.2.10.0030.32417.04
7.2.00.0030.36216.84

preferences:
33.73 ms | 401 KiB | 5 Q