is_callable() Terribly slow (700×) . souvislost s RobotLoaderem?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
bojovyletoun
Člen | 667
+
0
-

Ahoj, narazil jsem na takový problém ohledně rychlosti is_callable. Testováno na C2D T8300 @**1047.31 MHz, Apache 2 modul, PHP 5.3.5, Nette NS 2011–01–0×. Normálně trvá funkce 6ms – značeno OK, v pomalém případě **4000ms – SLOW
Podmínky chyby:

  • pokud volám is_callable před Environment::getRobotLoader();, tak problém není nikdy
  • is_callable("Nette\Debug::addPanel") true, OK
  • is_callable("Gadzo\Debug::addPanel") false, SLOW
  • is_callable("Debug::addPanel") false, SLOW
  • is_callable("Nette\Application\Presenter"), false, OK
  • is_callable(callback("Debug","addPanel")), true, OK
  • is_callable(callback("Debug::addPanel")), true, OK

.
Je mi divné, co dělá RobotLoader. Pak proč is_callable nebere v úvahu NS, ale callback() ano.
PS: profiler funguje.

EDITED: měl jsem starou verzi dibi , kde bylo is_callable(Debug:addpanel), stáhl jsem si aktuální a tam je to opravené( projevovalo se to při zapnutém profileru).

Editoval bojovyletoun (10. 1. 2011 17:23)

Filip Procházka
Moderator | 4668
+
0
-

Když uvážíš, že is_callable ti spustí načtení třídy robot loaderem, je logické, že to bude trvat trochu pomaleji, než prosté zavolání již načtené třídy :) ale 4 sekundy je opravdu hodně

Editoval HosipLan (11. 1. 2011 0:50)

sodae
Nette Evangelist | 250
+
0
-

souhlasím s HosipLan, ostatně si můžeš do configu přidat, ale cache si budeš muset mazat sám aby se vytvořila nová keš s novým seznamem tříd.

service.Nette-Loaders-RobotLoader.option.autoRebuild = FALSE
bojovyletoun
Člen | 667
+
0
-

Ach hlava děravá, zapomněl jsem na autorebuild v Developmnet.

David Grudl
Nette Core | 8228
+
0
-

Každopádně autorebuild by se měl vyvolat jen jednou, další volání stejného is_callable ho volat nemá.