3v4l.org

run code in 300+ PHP versions simultaneously
<?php class Pamiec { protected $iFizyczna = 0; protected $aFizyczna = array(); protected $iWirtualna = 0; protected $aWirtualna = array(); protected $aKolejka = array(); protected $aOdwolania = array(); protected $sTyp = 'FIFO'; public function __construct($iFizyczna, $iWirtualna, $sTyp = 'FIFO') { $this->iFizyczna = $iFizyczna; $this->iWirtualna = $iWirtualna; $this->sTyp = $sTyp; $this->aOdwolania = array_fill(0, $iFizyczna+$iWirtualna, 0); } public function kolejka($iAdres) { $this->aKolejka[ ] = $iAdres; } public function execute() { $iBledyStrony = 0; foreach($this->aKolejka as $iKey => $iAdres) { $iBledyStrony += $this->get($iAdres); unset($this->aKolejka[ $iKey ]); } return $iBledyStrony; } public function get($iAdres) { // na potrzeby LRU $this->aOdwolania[ $iAdres ] = 0; if(in_array($iAdres, $this->aFizyczna)) { return 0; } if(count($this->aFizyczna) >= $this->iFizyczna) { // echo '<hr />! '.$iAdres; // $this->drukuj(); // usuwam z pamieci wirtualnej $iKey = array_search($iAdres, $this->aWirtualna); unset($this->aWirtualna[ $iKey ]); //odpowiednie sortowanie $this->sort(); // przepisywanie pierwszego elementu fizycznej do wirtualnej $iTymczasowy = array_shift($this->aFizyczna); $this->aWirtualna[ ] = $iTymczasowy; } $this->aFizyczna[ ] = $iAdres; // na potrzeby LRU foreach($this->aOdwolania as $i => $v) { $this->aOdwolania[ $i ]++; } return 1; } protected function sort() { switch($this->sTyp) { case 'FIFO': // usuwamy stronę najdłużej przebywającą w pamięci fizycznej break; case 'OPT': // optymalny - usuwamy stronę, która nie będzie najdłużej używana $aOpcje = $this->aFizyczna; // szukamy w kolejce ostatniego elementu w liscie opcji foreach($this->aKolejka as $elem) { // jezeli znajdziemy w kolejce usuwamy z opcji wyszukiwanych $iKey = array_search($elem, $aOpcje); unset($aOpcje[ $iKey ]); // jezeli zostanie tylko jeden element to przesuwamy go // w kolejce fizycznej na pierwsze miejsce if(count($aOpcje) == 1) { $iKey = array_search(current($aOpcje), $this->aFizyczna); $tmp = $this->aFizyczna[ $iKey ]; unset($this->aFizyczna[ $iKey ]); array_unshift($this->aFizyczna, $tmp); return; } } break; case 'LRU': // usuwamy stronę, do której najdłużej nie nastąpiło odwołanie arsort($this->aOdwolania); // echo '<pre>'; // var_dump($this->aOdwolania); // echo '</pre>'; // sortujemy odwolania a nastepnie szukamy najwiekszego odstepu w fizycznej foreach($this->aOdwolania as $iAdres => $iCount) { // echo "szukam $iAdres<br />"; if(($iKey = array_search($iAdres, $this->aFizyczna)) !== false) { // echo $iAdres.'<br />'; // znaleziony adres w pamieci fizycznej przesuwamy na pierwsza pozycje $tmp = $this->aFizyczna[ $iKey ]; // echo implode(',',$this->aFizyczna).'<br />'; unset($this->aFizyczna[ $iKey ]); array_unshift($this->aFizyczna, $tmp); // echo implode(',',$this->aFizyczna); return; } } break; case 'aLRU': break; case 'RAND': // usuwamy losowo wybraną stronę shuffle($this->aFizyczna); break; } } protected function drukuj() { echo '<table border="1"><tr><td>Fizyczna</td>'; foreach($this->aFizyczna as $elem) { echo '<td>'.$elem.'</td>'; } echo '</tr><tr><td>Wirtualna</td>'; foreach($this->aWirtualna as $elem) { echo '<td>'.$elem.'</td>'; } echo '</tr></table>'; } } $iIloscStron = 10; //wirtualna $iIloscRamek = 10; //fizyczna $iMaxAdresy = $iIloscStron+$iIloscRamek; foreach(array('FIFO', 'LRU', 'OPT', 'aLRU', 'RAND') as $sTyp) { $Pamiec = new Pamiec($iIloscRamek, $iIloscStron, $sTyp); srand(5); for($i = 0; $i < 1000; $i++) { $Pamiec->kolejka(rand(0, $iMaxAdresy-1)); } srand(microtime(true)*100); echo $sTyp.' = '.$Pamiec->execute().'<br />'; }

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.2.00.0040.01819.14
7.1.70.0000.01917.17
7.1.60.0130.02319.82
7.1.50.0100.02316.64
7.1.00.0070.08322.36
7.0.200.0030.01416.48
7.0.140.0000.08322.18
7.0.100.0100.08720.20
7.0.90.0230.08720.08
7.0.80.0270.04720.07
7.0.70.0230.08320.03
7.0.60.0230.07320.11
7.0.50.0100.06320.40
7.0.40.0170.08020.04
7.0.30.0230.08020.03
7.0.20.0070.07720.00
7.0.10.0070.08020.10
7.0.00.0100.05720.09
5.6.280.0070.09321.19
5.6.250.0030.07020.86
5.6.240.0130.08320.68
5.6.230.0030.10720.79
5.6.220.0100.10320.58
5.6.210.0070.10320.69
5.6.200.0100.10721.08
5.6.190.0000.06721.06
5.6.180.0030.06321.07
5.6.170.0070.10321.21
5.6.160.0000.10720.95
5.6.150.0070.07021.06
5.6.140.0070.10321.15
5.6.130.0000.11321.21
5.6.120.0100.11021.15
5.6.110.0130.11321.20
5.6.100.0130.09021.05
5.6.90.0130.05321.40
5.6.80.0070.09320.45
5.6.70.0000.10720.46
5.6.60.0070.10720.52
5.6.50.0100.07720.59
5.6.40.0070.10320.51
5.6.30.0070.05320.57
5.6.20.0100.10020.41
5.6.10.0070.06720.32
5.6.00.0100.08720.40
5.5.380.0070.10020.45
5.5.370.0130.08320.43
5.5.360.0070.10320.57
5.5.350.0030.06320.45
5.5.340.0070.10720.97
5.5.330.0070.08321.15
5.5.320.0100.07720.93
5.5.310.0070.07320.92
5.5.300.0070.10320.86
5.5.290.0030.09320.80
5.5.280.0100.08020.88
5.5.270.0100.10320.86
5.5.260.0130.05320.86
5.5.250.0070.10020.75
5.5.240.0030.05720.23
5.5.230.0100.09320.22
5.5.220.0100.09720.24
5.5.210.0170.09020.48
5.5.200.0170.10020.20
5.5.190.0070.10320.26
5.5.180.0100.09320.25
5.5.160.0130.06320.54
5.5.150.0130.10020.30
5.5.140.0100.10720.32
5.5.130.0070.10020.16
5.5.120.0070.09720.07
5.5.110.0100.05020.28
5.5.100.0100.10320.20
5.5.90.0130.08020.20
5.5.80.0170.09020.12
5.5.70.0100.09720.14
5.5.60.0070.09720.07
5.5.50.0000.10720.09
5.5.40.0030.05320.10
5.5.30.0070.09319.98
5.5.20.0170.09320.25
5.5.10.0130.08320.06
5.5.00.0030.09020.07
5.4.450.0230.09019.36
5.4.440.0030.05719.51
5.4.430.0070.08719.64
5.4.420.0130.09319.36
5.4.410.0100.09719.38
5.4.400.0070.10018.88
5.4.390.0070.10019.16
5.4.380.0000.09718.88
5.4.370.0100.09719.18
5.4.360.0000.06719.15
5.4.350.0070.05018.95
5.4.340.0070.09318.95
5.4.320.0100.09719.18
5.4.310.0100.10019.09
5.4.300.0070.10019.03
5.4.290.0030.09019.16
5.4.280.0130.09719.04
5.4.270.0030.09319.08
5.4.260.0070.09318.90
5.4.250.0030.10319.11
5.4.240.0100.09319.13
5.4.230.0070.09019.04
5.4.220.0070.09318.94
5.4.210.0070.05019.20
5.4.200.0100.10019.02
5.4.190.0030.08719.02
5.4.180.0170.07319.15
5.4.170.0200.04019.17
5.4.160.0070.06319.10
5.4.150.0100.09719.14
5.4.140.0100.09316.59
5.4.130.0070.05316.46
5.4.120.0100.06316.39
5.4.110.0100.09316.52
5.4.100.0070.09016.45
5.4.90.0100.09316.54
5.4.80.0130.05716.46
5.4.70.0130.05716.48
5.4.60.0030.09716.47
5.4.50.0030.06316.51
5.4.40.0100.09016.45
5.4.30.0200.08716.36
5.4.20.0100.09716.42
5.4.10.0130.08016.54
5.4.00.0130.09315.93
5.3.290.0100.10314.96
5.3.280.0130.06314.98
5.3.270.0070.10715.02
5.3.260.0100.08714.81
5.3.250.0070.07714.87
5.3.240.0030.11014.95
5.3.230.0070.07314.87
5.3.220.0070.08714.83
5.3.210.0070.09714.92
5.3.200.0030.06014.81
5.3.190.0030.08014.89
5.3.180.0100.09714.90
5.3.170.0070.10314.96
5.3.160.0100.10714.85
5.3.150.0070.10014.78
5.3.140.0070.07714.82
5.3.130.0070.07314.79
5.3.120.0100.10714.81
5.3.110.0070.07314.97
5.3.100.0130.10314.45
5.3.90.0070.08014.28
5.3.80.0100.10714.31
5.3.70.0030.09714.31
5.3.60.0130.09714.38
5.3.50.0100.13014.23
5.3.40.0030.10014.20
5.3.30.0030.10714.11
5.3.20.0030.10713.97
5.3.10.0130.09713.91
5.3.00.0070.09713.97
5.2.170.0030.10012.08
5.2.160.0000.09312.08
5.2.150.0030.10012.08
5.2.140.0070.07712.08
5.2.130.0070.10012.08
5.2.120.0030.10012.08
5.2.110.0000.10012.08
5.2.100.0130.08312.08
5.2.90.0000.10012.08
5.2.80.0070.06712.08
5.2.70.0070.08712.08
5.2.60.0100.09012.08
5.2.50.0100.08012.08
5.2.40.0070.06312.08
5.2.30.0070.11012.08
5.2.20.0030.09712.08
5.2.10.0000.07312.08
5.2.00.0030.07312.08
5.1.60.0000.09712.08
5.1.50.0000.09312.08
5.1.40.0030.09012.08
5.1.30.0000.07012.08
5.1.20.0070.10012.08
5.1.10.0030.09712.08
5.1.00.0030.08312.08
5.0.50.0030.08012.08
5.0.40.0030.10312.08
5.0.30.0000.11312.08
5.0.20.0030.10312.08
5.0.10.0000.09012.08
5.0.00.0100.11012.08
4.4.90.0000.03312.08
4.4.80.0030.03312.08
4.4.70.0070.01012.08
4.4.60.0000.01712.08
4.4.50.0030.03712.08
4.4.40.0030.05312.08
4.4.30.0070.03312.08
4.4.20.0030.02312.08
4.4.10.0000.02012.08
4.4.00.0030.04712.08
4.3.110.0030.01712.08
4.3.100.0030.03312.08
4.3.90.0070.03012.08
4.3.80.0000.05312.08
4.3.70.0000.02712.08
4.3.60.0030.03012.08
4.3.50.0030.03312.08
4.3.40.0000.05312.08
4.3.30.0030.02312.08
4.3.20.0030.01712.08
4.3.10.0070.03312.08
4.3.00.0000.03312.08

preferences:
37.11 ms | 401 KiB | 5 Q