3v4l.org

run code in 500+ PHP versions simultaneously
<?php namespace RefactoringGuru\Proxy\RealWorld; /** * Интерфейс Субъекта описывает интерфейс реального объекта. * * Дело в том, что у большинства приложений нет чётко определённого интерфейса. * В этом случае лучше было бы расширить Заместителя за счёт существующего * класса приложения. Если это неудобно, тогда первым шагом должно быть * извлечение правильного интерфейса. */ interface Downloader { public function download(string $url): string; } /** * Реальный Субъект делает реальную работу, хотя и не самым эффективным * способом. Когда клиент пытается загрузить тот же самый файл во второй раз, * наш загрузчик именно это и делает, вместо того, чтобы извлечь результат из * кэша. */ class SimpleDownloader implements Downloader { public function download(string $url): string { echo "Downloading a file from the Internet.\n"; $result = file_get_contents($url); echo "Downloaded bytes: " . strlen($result) . "\n"; return $result; } } /** * Класс Заместителя – это попытка сделать загрузку более эффективной. Он * обёртывает реальный объект загрузчика и делегирует ему первые запросы на * скачивание. Затем результат кэшируется, что позволяет последующим вызовам * возвращать уже имеющийся файл вместо его повторной загрузки. */ class CachingDownloader implements Downloader { /** * @var SimpleDownloader */ private $downloader; /** * @var string[] */ private $cache = []; public function __construct(SimpleDownloader $downloader) { $this->downloader = $downloader; } public function download(string $url): string { if (!isset($this->cache[$url])) { echo "CacheProxy MISS. "; $result = $this->downloader->download($url); $this->cache[$url] = $result; } else { echo "CacheProxy HIT. Retrieving result from cache.\n"; } return $this->cache[$url]; } } /** * Клиентский код может выдать несколько похожих запросов на загрузку. В этом * случае кэширующий заместитель экономит время и трафик, подавая результаты из * кэша. * * Клиент не знает, что он работает с заместителем, потому что он работает с * загрузчиками через абстрактный интерфейс. */ function clientCode(Downloader $subject) { // ... $result = $subject->download("http://example.com/"); // Повторяющиеся запросы на загрузку могут кэшироваться для увеличения // скорости. $result = $subject->download("http://example.com/"); // ... } echo "Executing client code with real subject:\n"; $realSubject = new SimpleDownloader(); clientCode($realSubject); echo "\n"; echo "Executing the same client code with a proxy:\n"; $proxy = new CachingDownloader($realSubject); clientCode($proxy);

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.0110.00619.65
8.5.20.0120.00819.82
8.5.10.0100.01116.98
8.5.00.0130.01120.46
8.4.180.0180.00420.09
8.4.170.0110.01220.78
8.4.160.0150.00824.27
8.4.150.0090.00317.10
8.4.140.0110.01017.83
8.4.130.0070.01318.71
8.4.120.0140.00724.18
8.4.110.0050.00420.77
8.4.100.0130.00819.04
8.4.90.0120.00318.94
8.4.80.0150.00419.07
8.4.70.0090.01218.09
8.4.60.0070.00920.77
8.4.50.0110.01018.46
8.4.40.0100.00019.38
8.4.30.0090.00020.48
8.4.20.0190.00320.93
8.4.10.0090.00019.88
8.3.300.0130.00921.07
8.3.290.0130.00721.10
8.3.280.0130.00818.51
8.3.270.0100.01017.01
8.3.260.0170.00417.16
8.3.250.0090.01119.06
8.3.240.0150.00517.21
8.3.230.0050.00416.91
8.3.220.0120.00717.35
8.3.210.0100.00718.74
8.3.200.0070.00216.93
8.3.190.0110.00916.94
8.3.180.0100.01216.81
8.3.170.0090.01216.96
8.3.160.0110.00718.80
8.3.150.0120.00617.55
8.3.140.0060.01216.89
8.3.130.0070.00318.73
8.3.120.0030.00619.29
8.3.110.0060.00320.94
8.3.100.0030.01324.06
8.3.90.0080.00026.77
8.3.80.0060.00317.13
8.3.70.0060.00919.06
8.3.60.0090.00918.63
8.3.50.0090.00918.48
8.3.40.0080.00819.09
8.3.30.0040.01119.22
8.3.20.0040.00424.18
8.3.10.0080.00024.66
8.3.00.0050.00326.16
8.2.300.0130.00922.34
8.2.290.0110.00622.36
8.2.280.0030.00518.43
8.2.270.0100.00616.85
8.2.260.0040.00417.29
8.2.250.0000.00916.89
8.2.240.0120.00316.59
8.2.230.0080.00022.58
8.2.220.0050.00337.54
8.2.210.0070.00726.77
8.2.200.0030.00616.75
8.2.190.0120.00617.13
8.2.180.0160.01325.92
8.2.170.0110.00419.16
8.2.160.0170.00322.96
8.2.150.0030.00525.66
8.2.140.0040.00424.66
8.2.130.0000.00826.16
8.2.120.0080.00021.12
8.2.110.0030.00720.78
8.2.100.0060.00322.50
8.1.340.0110.00917.98
8.1.330.0140.00622.25
8.1.320.0130.00816.43
8.1.310.0100.00718.39
8.1.300.0060.01218.33
8.1.290.0060.00330.84
8.1.280.0090.00625.92
8.1.270.0040.01220.90
8.1.260.0080.00026.35
8.1.250.0040.00428.09
8.1.240.0070.00418.76
8.1.230.0000.01022.26
8.0.90.0040.00517.22

preferences:
44.22 ms | 958 KiB | 5 Q