Kiek iš tiesų kainuoja viso lib/ įkėlimas
Šiame straipsnyje
Šios paslaugos vienintelio įėjimo failo 46 eilutė:
foreach (glob(__DIR__ . '/lib/*.php') as $f) { require_once $f; }
Tai 65 failai ir 1,5 megabaito, įkeliami per kiekvieną užklausą. Skaitiklio paveikslėlis, statistikos puslapis, 404 — visur tas pats. Vakar taip nutiko 20 734 kartus.
Svarbus skaičius – mažasis
Viską įkelti nuo pradžių, išjungus operacijų kodų podėlį, trunka apie 132 milisekundes. Šis skaičius reikštų problemą, bet tai ne serverio mokamas skaičius.
Kai operacijų kodai jau sukompiliuoti ir laikomi bendrojoje atmintyje, lieka katalogo sąrašas ir po vieną stat() kreipinį kiekvienam failui, nes laiko žymų tikrinimas įjungtas: 0,33 milisekundės. Esant vakarykščiam srautui, tai mažiau nei septynios darbo sekundės per visą dieną.
Tarp jų – trečias matavimas, 18,2 milisekundės, gautas, kai operacijų kodų podėlis skaitė iš disko, o ne atminties. Tai viršutinė riba, o ne tikrasis skaičius — taip būna, kai podėlis yra, bet lėtesnis už tikrąjį. Jis pateikiamas, nes tai vienintelis šilto podėlio skaičius, kurį galima išmatuoti komandų eilutėje, o apsimesti kitaip būtų lengva klaida.
Taigi tai kainuoja beveik nieko, ir beveik nieko kainuoja vien dėl kažko kito. Išjungus operacijų kodų podėlį, ta pati eilutė kainuoja keturis šimtus kartų daugiau. Tai tikra priklausomybė, apie kurią verta žinoti, užuot atradus per atnaujinimą.
Kas iš tiesų yra tuose 1,5 megabaito
Keturiasdešimt septyni procentai — 715 kilobaitų per 26 failus — yra skaitiklių dizainų šeimos. Skaitiklio paveikslėliui nupiešti reikia tiksliai vienos. Kitos 25 įkeliamos, deklaruojamos ir niekada neliečiamos.
Toliau: 189 kilobaitai vėliavų duomenų, reikalingų geografijos puslapyje; 158 kilobaitai diagramų bibliotekos, reikalingos kam nors braižant diagramą. Nė viena nedalyvauja pateikiant skaitiklio paveikslėlį – užklausą, į kurią ši paslauga atsako dažniausiai.
Matoma kaina yra atmintis, o ne laikas. Didžiausias atminties naudojimas vienai užklausai padidėja apie keturis megabaitus, ir kitaip nei operacijų kodai — bendri visiems procesams, — ši dalis mokama kiekvienai užklausai, lygiagrečiai, kiekvieno vykdytojo vienu metu.
Kažkas jau pastebėjo
glob šablonas yra lib/*.php. Jis nerekursinis, o iškart po juo yra du katalogai: lib/live/ su 229 kilobaitais ir lib/recht/ su 182 kilobaitais. Keturi šimtai kilobaitų, kurie anksčiau buvo įkėlimo kelyje, o dabar nebėra.
Jie perkelti, nes dideli ir retai reikalingi: statistikos skiltys ir teisiniai tekstai. Vienu katalogu giliau – visas mechanizmas. Nėra nuostatų, atidėto įkėlimo ar automatinio įkėlimo žemėlapio — failas arba patenka į glob, arba ne.
Tai tikras pataisymas, ir verta tai pasakyti, nes akivaizdus kitas žingsnis būtų automatinis įkėliklis, o čia jis būtų didelis pakeitimas spręsti problemą, kurią mkdir jau išsprendė dukart.
Kodėl lieka
Vienas glob – paprasčiausias galintis veikti būdas, ir įrodymai sako, kad veikia: trečdalis milisekundės mažame serveryje, eigoje, kuri privalo būti greita. Pakeitus jį atskirų failų require kreipiniais, kiekvienam naujam failui reikėtų kur nors eilutės, o pamiršta eilutė sukeltų lemtingą klaidą veikiančioje sistemoje vietoj kiek didesnio įkėlimo.
Ko iš tiesų reikia – užrašyti tai, kas nuo pradžių leido išsilaikyti: jei failas kataloge lib/ išauga, jis perkeliamas į pakatalogį ir įkeliamas su require ten, kur naudojamas. Tai taisyklė, kurios laikėsi tie du katalogai, ir iki šiol ji niekur nebuvo užrašyta.
Bendroji versija nuobodesnė už matavimą. „Viskas įkelia viską“ paprastai yra netinkama sandara, ir prieš perkuriant verta išmatuoti kainą. Čia ji – 0,33 milisekundės ir keturi megabaitai, o stebėti verta keturis megabaitus, nes jie auga su vienalaikiškumu, o milisekundės – ne.