Ukladanie inych instancii v objekte rubrika: Programování: PHP

6 mario2402
položil/-a 14.1. 13:39

Caute,

chcem sa opytat jednu "technicku" vec, ktorej nerozumiem..

Preco trva vytvorenie novej instancie a jej ulozenie cca 6x dlhsie:

public $routes;
 
public function addRoute ()
{
 
  return $this->routes[] = new Route();
 
}

ako ked ju ulozim do statickej property:

public static $routes;
 
public function addRoute ()
{
 
  return self::$routes[] = new Route();
 
}

v com presne to spociva, ked je casovy rozdiel tak obrovsky.. (1 milion iteracii / 1800ms vs 300ms)

PHP 7.2.10 , Widle 10 64bit..

odkaz
6 rs
odpověděl/-a 14.1. 21:53

PHP nema JIT kdyz pouzijes $this->routes tak PHP musi nejprve pres $this-> najit adresu objektu nasledne v danem objektu najde adresu kde je ulozeno pole routes a pak teprve ukladas do daneho pole.

U statickeho volani tam spousta teto rezie odpada protoze dane pole je v pameti pouze jedno muze PHP tento kus kodu zahodit a pristoupit rovnou na adresu daneho pole coz je performance boost.

Nicmene bych se neridil tim jak moc je to rychle ale tim jak je to spravne a staticke promene vetsinou spravne nejsou

Komentáře

  • Anonym : ale on se potřebuje řídit tím, jak je to rychlé :D a na statické proměnné není naprosto nic špatného 15.1. 8:15
  • mario2402 : hmmm, osobne som si myslel, ze pole je v oboch pripadoch vzdy jedno a najde sa na zaklade objektu, nie na zaklade pola samotneho.. moja chyba.. praveze mi o rychlost ide.. vyriesil som to tak, ze pole vytvorim mimo objektu, a az ked je hotovo ho ulozim do objektu ( $this->routes = $routes ) .. 15.1. 9:07
  • harrison314 : @mario2402: Ak musis pri nicom takomto riesit richlost, tak si si na to zvolil velmi zly jazyk. 15.1. 9:17
  • mario2402 : ja som si nic nevolil, (mikro)optimalizujem cudziu aplikaciu, pri ktorej hraju rolu milisekundy.. len touto malou optimalizaciou som usetril cca 5% casovej rezie.. a to sa oplati :D 15.1. 9:51
  • Kit : @mamario2402: Co kdybys na to šel obráceně a celé pole vytvořil naráz uvnitř toho objektu? 15.1. 11:09
  • mario2402 : ee, musi sa to vyrabat mimo objektu lebo k tomu potrebujem este ine zavislosti, v objekte je len ich nasledne uskladnenie.. cize predtym: $skladRoutes->addRoute()->metodaRoute()->dalsiaMetodaRoute()->atd... teraz prerobene na $route[] = ( new Route )->metodaRoute()->dalsiaMetodaRoute()->atd .. a vysledne pole $route len vlozit do property v tom $skladRoutes.. vysledok = minimalne 6x rychlejsie 15.1. 11:37
  • Kit : @mario2402: Uvědom si, že objekt není skladiště. 15.1. 11:47

Pro zobrazení všech 2 odpovědí se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.