3v4l.org

run code in 150+ php & hhvm versions
Bugs & Features
<?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 />'; }
Output for 7.1.0
FIFO = 488<br />LRU = 486<br />OPT = 245<br />aLRU = 488<br />RAND = 483<br />
Output for 5.3.23, 5.4.5, 5.4.7 - 5.4.8, 5.4.10, 5.4.12 - 5.4.13, 5.4.16 - 5.4.17, 5.4.21, 5.4.35 - 5.4.36, 5.4.44, 5.5.4, 5.5.11, 5.5.24, 5.5.26, 5.5.28, 5.5.31, 5.5.35, 5.6.1, 5.6.3, 5.6.5, 5.6.8 - 5.6.9, 5.6.15, 5.6.18 - 5.6.19, 5.6.25, 7.0.3, 7.0.6, 7.0.9, 7.0.14
FIFO = 476<br />LRU = 478<br />OPT = 268<br />aLRU = 476<br />RAND = 486<br />
Output for 7.0.0 - 7.0.2, 7.0.4 - 7.0.5, 7.0.7 - 7.0.8, 7.0.10
FIFO = 476<br />LRU = 478<br />OPT = 268<br />aLRU = 476<br />RAND = 477<br />
Output for hhvm-3.12.0
FIFO = 476<br />LRU = 476<br />OPT = 268<br />aLRU = 476<br />RAND = 486<br />
Output for hhvm-3.10.0
FIFO = 476<br />LRU = 476<br />OPT = 268<br />aLRU = 476<br />RAND = 494<br />
Output for 5.2.0 - 5.2.1, 5.2.4, 5.2.7, 5.2.14, 5.3.0, 5.3.4, 5.3.6 - 5.3.9, 5.3.11 - 5.3.18, 5.3.20 - 5.3.22, 5.3.24 - 5.4.4, 5.4.6, 5.4.9, 5.4.11, 5.4.15, 5.4.18 - 5.4.20, 5.4.22 - 5.4.34, 5.4.37 - 5.4.43, 5.4.45 - 5.5.3, 5.5.5 - 5.5.10, 5.5.12 - 5.5.21, 5.5.23, 5.5.25, 5.5.27, 5.5.29, 5.5.32 - 5.5.34, 5.5.36 - 5.6.0, 5.6.2, 5.6.4, 5.6.6 - 5.6.7, 5.6.10 - 5.6.14, 5.6.16 - 5.6.17, 5.6.20 - 5.6.24, 5.6.28
FIFO = 476<br />LRU = 478<br />OPT = 268<br />aLRU = 476<br />RAND = 508<br />
Output for 5.1.0 - 5.1.6, 5.2.2 - 5.2.3, 5.2.5 - 5.2.6, 5.2.8 - 5.2.13, 5.2.15 - 5.2.17, 5.3.1 - 5.3.3, 5.3.10, 5.3.19, 5.4.14, 5.5.22, 5.5.30
FIFO = 476<br />LRU = 478<br />OPT = 268<br />aLRU = 476<br />RAND = 488<br />
Output for 5.0.0, 5.3.5
FIFO = 476<br />LRU = 478<br />OPT = 268<br />aLRU = 476<br />RAND = 480<br />
Output for 5.0.1 - 5.0.5
FIFO = 476<br />LRU = 478<br />OPT = 268<br />aLRU = 476<br />RAND = 487<br />
Output for 4.4.2 - 4.4.9
Parse error: syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in /in/TIpGJ on line 4
Process exited with code 255.
Output for 4.3.0 - 4.3.1, 4.3.5 - 4.4.1
Parse error: parse error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in /in/TIpGJ on line 4
Process exited with code 255.
Output for 4.3.2 - 4.3.4
Parse error: parse error, expecting `T_OLD_FUNCTION' or `T_FUNCTION' or `T_VAR' or `'}'' in /in/TIpGJ on line 4
Process exited with code 255.