Může počet presenteru, servis a továrniček výrazně ovlivnit rychlost aplikace?

Sofiosko
Člen | 7
+
+2
-

Už nějakým tím rokem pracuji na projektu, který za svůj život šíleně nabobtnal a rychlost začala značně pokulhávat. Rozhodl jsem se proto s tím něco udělat.

Po spoustě optimalizací jsem to stáhnůl na 400ms po cachnuti DI containeru bez vykreslení obsahu (localhost), což je strašně moc.
Pro porovnání:

  • Testovaný projekt má 90 presenteru a přes 400 servis a jede okolo 400ms
  • Čistá instalace nette mi jede okolo 30–40ms
  • Malý projekt o 10 presenterech a cca 10–20 servisách jede okolo 40–50ms

Což není tak šílený rozdíl (mezi čistým a malým projektem) abych mohl podezřívat velikost aplikace ale i přesto jsem se rozhodl zkusit celý projekt od začátku sestavit a to tak, že jsem nevkládal žádné servisy, továrničky ani presentery, které nebyly potřeba pro rozjetí projektu a dostal se na 200–230ms.

U obou aplikací jsem porovnával identický presenter jenž rozšiřoval ten samý BasePresenter a ve výsledku injectovali úplně to samé co reálně využili.

U původního pomalejšího projektu jsem ještě zkusil v configu zakomentovat servisy, které presenter nepoužíval ale narazil jsem na problém. Pokud existují fyzicky neaktivní presentery, musí být zaregistrované i servisy jenž injectují.

Otázka tedy zni: Je možné, že takovéto velké množství presenterů způsobí rapidní zpomalení aplikace i po cachnutí DI containeru? Nebo bych měl dále hledat chybu v kódu?

Děkuji a doufám, že nepřivolám dav s vidlemi a loučemi :D

Editoval Sofiosko (17. 11. 2019 1:02)

CZechBoY
Člen | 3608
+
+1
-

To neni zas tak velkej projekt… spis se koukni jestli nedelas v konstruktoru nejakou praci navic krom prirazeni parametru do properties.

JiriSlischka
Člen | 9
+
+1
-

Viz co psal CZechBoY, můžeš mít v constructoru logiku. Která se spouští zbytečně.
Jedním z případu jsou třeba CLI commandy. Pokud definuješ název commandu přes configure metodu. Tak se musí každý CLI command vytvořit, aby se zjistilo jaký název ten command má.
Pokud ten název přesuneš do public static $defaultName = 'business:charge-excesses';. Tak se ti zrychlí načtení commandů. A reálně se vytvoří pouze ten jeden command (a k němu dané služby) a ne všechny co v appce máš.
To může appku hodně zpomalit protože se může vytvářet DB spojení, session, rabbit atd.

Felix
Nette Core | 1245
+
+4
-

Zkusil bych si zapnout Blackfire (https://blackfire.io/) a udelat request na homepage a pak nejakou statickou stranku, kde by nemel byt zadny vykon.

Z moji zkusenosti, dost zere navesovani eventu na cokoli. Tak se mrkni, jestli tam nemas nejakou slozitou logiku.

Marek Bartoš
Nette Blogger | 1274
+
+4
-

Při testování se ohlížej též na to, zda máš zapnutý debug mód. Při debugu se kontrolují změny v souborech a též zapnuté debug panely mohou trvat podstatnou část requestu.

Pokud trvá načtení DI kontejneru samo o sobě, tak nejspíš jde o konfiguraci OPcache.

Nejsnadněji se to dá vyčíst ze zmiňovaného Blackfire

Sofiosko
Člen | 7
+
0
-

Děkuji všem za spoustu skvělých nápadů a hned se do toho pustím.

Sofiosko
Člen | 7
+
+1
-

@CZechBoY Díky za radu, zkontroloval jsem každý konstruktor v aplikaci a našel 2 výskyty, které sice nezpomalovali testovací stránku ale někde v aplikaci určitě jo.

@JiriSlischka Díky, přivedl si mě na dvě věcí které pomohli aplikaci urychlit. Skrze klíčove slovo „configure“ jsem narazil na metodu, jenž upravovala šablony a zpomalovala je a také jsme měli v routeru CLI továrničku zastaralou, nepoužívanou, která žrala 20ms při každém requestu

@Felix @Mabar O blackfiru jsem již slyšel ale nikdy jsem se ktomu neměl. Na vaše doporučení jsem to teda rozchodil a zde je odkaz https://blackfire.io/…cd10d5/graph nebo https://blackfire.io/…371e88/graph a po všech úpravách jsem dokázal stahnout čas aplikace na ~270ms díky blackfiru.

Což je mnohem lepší ale stále to není ono. Je možné z toho odkazu vysledovat ještě něco podezřelého? Mě připadá podezřelé že vkládání souborů z vendora on demand žere 80ms.

Editoval Sofiosko (18. 11. 2019 10:00)

fizzy
Backer | 49
+
+1
-

mozes odinstalovat nette robot loader a pouzivat len jeden loader – composer

h4kuna
Backer | 740
+
+1
-

composer má přepínač composer dumpautoload -a pro vytvoření class mapy a tím se zrychlí načítání, doporučuje se na produkci, na vývoji chceš aby si composer skládal cesty.