Oks: kiirendage selle mallide loomist
Veebiagentuur » Digitaalsed uudised » Oks: kiirendage selle mallide loomist

Oks: kiirendage selle mallide loomist

Hiljuti palusin endal mõtiskleda Twigi pakutavate lahenduste üle, et pääseda ligi objekti või massiivi omadustele.

Juurdepääs objekti omadusele

Twig loodi meie mallide lihtsustamiseks nii koodi kui ka puhtuse osas. See loodi ka selleks, et võimaldada integraatoritel, inimestel, kellel kõigil pole arendusteadmisi, lihtne juurdepääs objekti või teiste omadustele. Seda tänu lihtsustatud süntaksile.

Alles siis, olles ennekõike arendaja, esitasin endale küsimuse, kuidas oksaga läheb, et määrata, millist meetodit objektil nimetada.

Okste süntaks

Järgmises koodis eeldan, et kasutan klassi nagu allpool.

1
2
3
4
5
6
7
8
9
10
11
12
13
klass objekt
{
era- $Nimi;
avalik $kasutajanimi;
avalik funktsioon getName() {
tagasipöördumine $ see->nimi;
}
avalik funktsioon hankige kasutajanimi() {
tagasipöördumine $ see->kasutajanimi;
}
}

Nii kutsun ma oma malli Symfony kontrollerist.

1
2
3
avalik funktsioon indeksAction() {
tagasipöördumine massiivi("objekt" => $objekt);
}

Siiani on kõik selge. Minu objekt näeb välja täpselt nagu objektid, mida saan oma projektides kasutada.

Deklaratsioonide sõelumine Twigis

1
{{ object.name }}

Nüüdsest näeme, kuidas Twig meie kõnedega töötab. Siin palume Twigil väärtus võtta nimi minu objektist, välja arvatud see, et Twigi jaoks, mis on lõpuks vaid lihtne PHP-kutse, on see muutuja kättesaamatu. Twig on seetõttu lisanud puhverserveri, et teha ülevaadet ja näha, millised omadused ja meetodid on saadaval.

Seetõttu palub Twig allolevas järjekorras objekti kontrollida.

  1. Vaata, kas objekt on massiiv ja kui nimi on võti;
  2. Vaata, kas objekt on objekt ja kui nimi on juurdepääsetav atribuut;
  3. Vaata, kas objekt on objekt ja kui nimi on meetod;
  4. Vaata, kas objekt on objekt ja kui getName on meetod;
  5. Vaata, kas objekt on objekt ja kui isName on meetod.
    Siin pidime meie kasutatud tähistusega ootama 4. tingimuse saabumist meie elemendile. Sest nimi ei ole juurdepääsetav atribuut ega meetod.

    1
    {{ object.username }}

Sel juhul proovime juurde pääseda kasutajanimi. See atribuut on avalik atribuut (Symfonys kohtasin seda juhtumit harva). Peame ootama 2. tingimust.

1
{{ object.getName() }}

Meie kolmandal juhul proovin oma meetodit otse välja kutsuda. Oma tulemuse saan kolmandast tingimusest, mis on kiirem seisund.

1
{{ object.getUsername() }}

Meie neljandal ja viimasel juhul proovin oma meetodit otse kasutada. Oma tulemuse saan kolmandast tingimusest. Sel juhul panin oma väärtusele juurdepääsuks lisatingimuse.

Twig mallide tõlgendamine

Kui ma seda detaili vaatasin, mõtlesin, kuidas Twigi arendajad oleksid saanud teha vahemällu salvestamist ja mallide koostamist. Ei läinud kaua, kui jõudsin järeldusele, et vähese teabe ja mallihalduri pakutava vabadusega transkribeeritakse meie failid lihtsalt PHP-sse sarnaselt sellega, mida me saaksime teha. Saate seda ka ise vahemälu kausta vaadates näha.

1
2
{# Malli haru #}
{{ object.name }}
Mall on tõlgendatud PHP-s
1
echo twig_escape_filter($this->env, $this->getAttribute((isset($context["objekt"]) ? $context["object"] : $this->getContext($context, "object")), “nimi”), “html”, null, tõene);

Esimene plokk ühtib sellega, mida märkisin oma oksamallis, teine ​​plokk vastab tõlgitud versioonile, mille leidsin vahemälu kaustast.

Märgime, et haru on tõlgitud PHP-sse, kuid ükski element ei võimaldanud ennustada, millist meetodit täpselt kutsuda. Meetod haru_escape_filter võiks võrrelda puhverserveriga. Selle meetodi abil määrame, kuidas me atribuudile juurde pääseme.

järeldus

Kuigi Symfony salvestab oksamallid automaatselt vahemällu, säilitatakse ainult PHP versioon, kuid ilma tõlgenduseta, mida soovite hankida. Teoreetiliselt on siin seega olemas vahendid kõnede optimeerimiseks ja meie mallide genereerimise aeg, kuna kontrollimine toimub iga kõne puhul.

võrrelda

Tahtsin ikkagi saada aimu kasudest, mida saab pigem meetodite kutsumisega kui " alias '.

Esimesel juhul kutsun ma välja malli, mis kutsub 10 korda sama objekti, mis omakorda kutsub 25 varjunime. See tähendab 250 kõnet. Tulemusi suurendatakse 10 tsükli võrra, et võimaldada jõudluse suurenemise täpseid arvutusi.

Teiseks kutsun ma välja malli, mis kutsub sama objekti 10 korda ja mis omakorda kutsub välja 25 meetodit (alati sama puhverserveri kaudu nagu varjunimede puhul). See on jälle 250.

Ma kutsusin neid malle 5 korda.

Pange tähele, et kõik mallile tehtavad kõned, mis helistavad meetoditele, on kiiremad. Võttes keskmised, märkame, et varjunimesid kasutav mall on 54,6 millisekundi võrra pikem (197.4–142.8).

Kiire arvutuse tegemisel märkame, et kui taandada see üldjuhtumiks, on meetodite väljakutsumist kasutav mall samadel andmetel keskmiselt umbes 26.7% kiirem. See võib olla huvitav, kui teete palju kõnesid objektidele.

See teine ​​artikkel järgneb esimesele postitusele, mis pakub kiireid lahendusi mallide genereerimise optimeerimiseks. See on optimeerimise vili, mida on juba kasutatud tootmissaitidel, millel oli liiga kõrge latentsusaeg.

Kasutame kõiki hõlmab de Kukk et muuta või arvesse võtta meie seisukohti. Kuid võib-olla te ei saanud kunagi aru, miks meil oli võimalus parameetreid edastada, kui põhiline kaasamine pärib muutujad praegusest kontekstist.

1
{% sisaldama "ProjectMyBundle:Sub:template.html.twig" %}

Sageli kasutame seda tähistust. Sel juhul lisab kaasamine meie mallile kõigi meie muutujate koopia. See ei ole alati vajalik ja me eksime kõiki muutujaid kopeerides.

Huvi "ainsa" variandi vastu

Mõtlesin tükk aega, mis selle variandi mõte on. Pealegi tuleb öelda, et dokumentatsioon ei anna palju teavet. Võite heita pilgu Twig sisaldab dokumentatsiooni. See annab vähe elemente, kuid annab eriti puuduse ja ei mingit eelist: teha ilma teatud muutujateta. Selliselt vaadatuna pole see tulus; miks ma peaksin ilma muutujateta hakkama saama.

Rakendame oma kaasad! Oletame, et meie baasmallil on 5 muutujat ja ma lisan malli, mis kasutab ainult ühte neist muutujatest. See on eelistatav tähistus.

1
{% sisaldama "ProjectMyBundle:Sub:template.html.twig" ainult koos {"object": myVar} %}

Sel viisil on minu mallis saadaval ainult muutuja "objekt". See piirab kasutute muutujate kopeerimist ja seega ka mälu eraldamist (säästab aega ja mälutarbimist).

Kood ja kasutusjuhud

1
2
3
4
5
6
// Kontroller
// Siin genereerib malli, edastades määrava muutuja (kogu), mis sisaldab kõiki antud tabeli objekte
avalik funktsioon testAction() {
$objektid = $ see->konteiner->hangi("doctrine.orm.default_entity_manager")-> getRepository("ProjectMyBundle: Test")->leia kõik();
tagasipöördumine massiivi("esemed" => $objektid);
}

Vaatame oma kollektsiooni üle ja anname mallile iga kollektsiooni iteratsiooni malli. Sel juhul kopeeritakse iga kord, kui kutsume malli integreerima kõik muutujad ja ka need, mis on edasi antud. valik "koos".. Esimesel juhul võiksime väga hästi ette kujutada juurdepääsu nii oma kogule (objektidele) kui ka praegusele iteratsioonile (objektile).

1
2
3
4
5
{#Mall 1#}
{% eest objekt objektides %}
{% sisaldama "ProjectMyBundle:Sub:template.html.twig" koos {"object": object} %}
{% endfor %}

Meie teisel juhul aktiveerin valiku ainult mis võimaldab kopeerida ainult parameetritena edastatud muutujaid. Lihtne?

1
2
3
4
5
{#Mall 2#}
{% eest objekt objektides %}
{% sisaldama "ProjectMyBundle:Sub:template.html.twig" ainult koos {"object": object} %}
{% endfor %}

võrrelda

Testid viisin läbi ülaltoodud osas toodud mallide ja koodiga. Tegin iga malli 5 iteratsiooni, pidades meeles vahemälu tühjendamist enne iga esimest testi.

Selle graafiku abil näeme, et laadimine on üldiselt pikem nende jaoks, kes seda võimalust ei kasuta ainult. Erinevus kipub pärast vahemällu salvestamist vähenema. Selle põhjuseks on asjaolu, et minu mall on väike ja muutujaid kasutatakse vähe. Rohkem rakendatud juhtudel on kasu kuni 30%.

Kui me arvutame väärtuste keskmise, siis saavutame keskmise erinevuse 9 ms (48,6–39,6 = 9). Seetõttu saame arvutada ligikaudse 20% kasu isegi siis, kui seda meie puhul arvesse võtta, kuna esimene võte on kohutavalt pikk ilma "kasutamata". ainult '.

★ ★ ★ ★ ★