PHP: Kif Tikteb Script ta' Prestazzjoni Għolja
PHP jista 'jkun lingwa simili għall-iskript u kkritikat talli huwa bil-mod, iżda jibqa' wieħed mill-lingwi tal-web server l-aktar użati. Maż-żmien, il-kumpaniji ewlenin tal-web li jużaw PHP fittxew li jottimizzaw il-magna. L-introduzzjoni tal-kunċett ta ' Kollettur taż-Żibel fil-verżjoni 5.3 kien avvanz notevoli. Iżda hemm ħafna modi biex'jottimizza l-prestazzjoni ta' skript.
Prinċipalment użat fil-qafas tal-ġenerazzjoni sempliċi tal-paġna, dawn l-ottimizzazzjonijiet, għalkemm jistgħu jġibu ċertu qligħ, mhumiex viżibbli biżżejjed għall-utent. L-ottimizzazzjoni tad-databases, is-servers tal-web bl-użu ta 'Nginx, l-ottimizzazzjoni tal-magna bil-wasla ta' HHVM jew saħansitra HippyVM se jippermettulek sempliċement tħaffef ir-rendiment tal-paġni tiegħek u tottimizza l-ħin tat-tweġibiet għall-mistoqsijiet tiegħek b'mod aktar sempliċi. Minkejja dan, aħna kultant niżviluppaw skripts PHP bil-għan li nagħmlu trattament tqil, jew servers tal-web ma jistgħu jagħmlu xejn.
F'din il-kariga, se nagħti dettalji tliet oqsma ta 'ottimizzazzjoni li dan l-aħħar applikajt għal skript li kellu jipproċessa fajls CSV jew XLS li fihom ammont kbir ta’ informazzjoni. L-ammont ta 'memorja użat laħaq 1GB mingħajr inkwiet u jista' jdum aktar minn siegħa 1/2.
Qabel ma nippreżentalkom it-tliet kunċetti PHP li jistgħu jippermettulekjottimizza l-ħin tal-eżekuzzjoni kif ukoll l-ammont ta 'memorja meħuda, kun af li qabel ma tilmenta dwar lingwa X, l-algoritmiku tal-iskrittura tiegħek huwa responsabbli għal parti tajba mill-ipproċessar tiegħek. C++ jista 'jkun infinitament aktar mgħaġġel mill-PHP, iżda jekk l-algoritmi C++ tiegħek huma ħżiena, mhux se jsolvi l-problemi tiegħek immedjatament.
Deallocate varjabbli, jillimitaw il-konsum tal-memorja
Qabel ma ġie rilaxxat PHP 5.3, il-problema tal-PHP kienet il- konsum eċċessiv tal-memorja. Barra minn hekk, spiss smajt li l-konsum tal-memorja ta 'skript PHP qatt ma jista' jitnaqqas ... Jekk dan kien minnu għal xi żmien, fortunatament m'għadux veru. Dan il-maniġment juża l-kunċett ta’ Garbage Collector li se naraw ftit aktar ‘l isfel.
Vizzju tajjeb mitluf...
F'xi lingwi, dan kien obbligatorju. Fil-PHP, dan il-kunċett intesa kompletament! Din il-funzjoni nattiva ftit unset (), huwa liutilità formidabbli. Huwa ekwivalenti għall-funzjoni free() f'C++ u jippermetti dealloka u għalhekk ta’ immedjatament ħeles il-memorja użat mill-varjabbli. Il-varjabbli hija kompletament meqruda. Dan inizjalment jillibera PHP minn varjabbli mhux użati. Dan għandu interess ieħor, li jgħinna nistrutturaw aħjar l-algoritmi tagħna. Naturalment, meta jintemm metodu l-varjabbli huma awtomatikament deallokati iżda se tara hawn taħt li dan jippermettilek li tottimizza l-ħin li l-"kollettur taż-żibel" iqatta 'xogħol jew sempliċiment jagħmel xogħolu fil-każ li jiġi diżattivat. Hemm għalhekk ukoll gwadann f'termini ta' veloċità. U emminni, il-GC jikkonsma ħafna riżorsi biex tillibera l-memorja.
Kif għedt fil-paragrafu preċedenti, fl-aħħar ta 'funzjoni jew metodu, PHP jneħħi varjabbli mhux użati. Iżda fil-każ ta' skript li jipproċessa data tal-massa, huwa possibbli li funzjoni waħda tamministra l-oħrajn. Bħal f'xi lingwi, jekk hija funzjoni ewlenija, probabilment ikollok it-tendenza li taħżen varjabbli lura mill-funzjoni qabel tgħaddihom għal funzjonijiet oħra. Nistgħu malajr nispiċċaw b'ammont kbir ta 'dejta. Hekk kif ma tibqax tintuża, m'hemm l-ebda skop li "jġorrha" madwar, aħna deallolokawha.
Riċentement, waqt li kont qed nikteb skript fejn kont qed niġbed fajl sħiħ akbar minn 15-il MB, ladarba kont użajtu, ħassejtu u ħallejt jiksbu memorja !
Nifhmu l- Kollettur taż-Żibel
Kien waqt ir-riċerka dwar il-ġestjoni tal-memorja li ltqajt ma' artiklu ta' kollega. F’dan l-artiklu li issa huwa xi ftit antik, Pascal Martin jispjega n-novità li m’għadhiex waħda, il-Għaqda taż-Żibel.
X'inhu Kollettur taż-Żibel?
Għal dawk li ma jafux jew li diġà semgħu bih iżda qatt ma kellhom l-opportunità li jużawh, il-Grabage Collector li huwa tradott bħala "crumb pick-up" bil-Franċiż, funzjonalità ta' livell baxx li f'intervall X, iwaqqaf il-proċess li qed jaħdem, u jwettaq skan tal-memorja allokata mill-iskript biex jiskopri liema varjabbli m'għadhomx aċċessibbli biex tħassarhom.
Ma nifhimx, qabel qaluli li fl-aħħar ta 'metodu PHP jeqred il-varjabbli.
Dan mhux għal kollox minnu. Bl-istess mod bħal C jew C++ (ġenitur tal-PHP), fl-aħħar ta 'metodu, PHP joħroġ u jitlef ir-referenza li kellu fuq l-oġġett. F'C, jeżisti biss il-kunċett ta 'pointer, f'C++ l-kunċetti ta' pointer u referenza jikkoeżistu.
Ladarba r-referenza għall-oġġett tkun intilfet, u ladarba jibda l-Kollezzjonir taż-Żibel, dan tal-aħħar jiddetermina li l-varjabbli ma jibqax aċċessibbli u jeqredha.
Dan il-kunċett huwa preżenti ħafna fil-JAVA kif ukoll f'lingwi oħra aktar riċenti u konsegwentement ta 'livell ogħla.
Xi ġab il-Ġalleb taż-Żibel?
Il-GC ipprovda flessibbiltà konsiderevoli għall-iżvilupp. Huwa ovvju li l-iżvilupp f'C huwa aktar tekniku milli f'Java, PHP jew oħrajn. Minkejja dan, xi aspetti issa huma minsija bħall-ġestjoni tal-memorja u huwa l-kodiċi tagħna li xi kultant empathizes. Jekk dan ġab flessibbiltà fl-iżvilupp tagħna, naqqset ukoll l-eżekuzzjoni tal-programmi tagħna.
B'dawn l-għodod, dak li m'għandniex ninsew huwa li dejjem nistgħu nikkontrollaw il-memorja b'xi mod. Kwistjoni ta’ rieda, jew ta’ ħtieġa…
Fl-aħħar nett, naħseb li dan it-tip ta 'għodod huma prattiċi ħafna iżda ma jistgħux jissostitwixxu l-istruzzjonijiet mogħtija mill-iżviluppaturi. Min-naħa tiegħi, insib li l-kunċett ta 'C++ shared_ptr
huwa ħafna aktar interessanti u jista 'joffri gwadann ta' prestazzjoni kbar fil-futur jekk Zend jiddeċiedi li juża dan il-metodu f'xi każijiet.
U fil-PHP?
Minn PHP 5.3, ġew miżjuda erba 'funzjonijiet.
- gc_enable
- gc_enabled
- gc_disable
- gc_collect_cycles
Inħallik il-ħin liberu biex taqra d-dokumentazzjoni, iżda biex tkun malajr, jippermettulek tattiva l-GC, tkun taf jekk huwiex attiv, iddiżattivaha, u tibda l-ġbir manwalment.
Pascal Martin ippubblika fil-post li għaqqadlek hawn fuq, script fejn iwettaq batterija tat-test. Nistgħu naraw b'mod ċar fir-rapport tat-test li l-verżjoni mingħajr GC tilħaq konsum enormi ta 'memorja, anke tilħaq il-limitu u tiġġarraf.
Kriterju
Hawn hu l-kodiċi esegwit. Dan ittieħed mill-blog ta’ Pascal Martin u b’mod aktar partikolari mill-artiklu tiegħu.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
klassi nodu {
pubblika $parentNode;
pubblika $childNodes = firxa();
funzjoni nodu() {
$ dan-> nodeValue = str_repeat ('0123456789', 128);
}
}
funzjoni createRelationship() {
$ġenitur = ġdid node();
$tifel = ġdid node();
$parent->childNodes[] = $tifel;
$child->parentNode = $ġenitur;
}
għall ($i = 0; $i 500000; $i++) {
toħloqRelazzjoni();
// Din il-parti tiġi esegwita matul it-tieni test
if ($għażliet[“gc_manual”]) {
gc_collect_cycles();
}
}
|
Nagħmel tliet testijiet separatament:
- Nagħmel dan it-test bl-għażliet bażiċi. Il-Ġbir taż-Żibel huwa attivat u PHP jmexxih fuq bażi regolari. L-iskript għandu tul Secondes 7.55 u l-memorja użata laħqet 20.98 Mo.
- Jien nagħmel l-istess test billi niżżanża l-Gabage Collector u nsejjaħlu f'kull dawra tal-linja. L-iskript idum 3.79 sekondi u l-memorja użata laħqet il-quċċata 244.77 KB.
- Jien nagħmel it-tielet test billi niżżanża l-Gabage Collector u qatt ma niġbor manwalment. Il-memorja trid għalhekk timla bil-qawwa. L-iskript idum 4.46 sekondi u l-memorja laħqet 1.98 Mur.
B'dan it-test, nistgħu naraw b'mod ċar l-importanza tal-ġestjoni tal-memorja. Fl-eżempju tagħna, li jittieħed sal-estrem, nistgħu naraw b'mod ċar l-importanza. Min-naħa l-waħda, il-Kollezzjonir taż-Żibel jagħmel ħafna xogħol fuq il-konsum tal-memorja, iżda dan għandu t-tendenza li jnaqqas l-eżekuzzjoni tal-iskript. Nistgħu narawha tajjeb ħafna billi nqabblu l-ewwel test (bil-GC) u t-1 test mingħajr ġestjoni.
Fejn isir ix-xogħol tal-prestazzjoni tagħna huwa fuq it-test 2. L-ebda ġestjoni awtomatika tal-memorja, ġestjoni manwali ottimizzata fi ħdan dan l-iskritt. Nirnexxilhom naċċelleraw il-veloċità tal-ipproċessar bi kważi darbtejn (7.55s / 3.79s = 1.99). B'dan il-mod, illimitajna wkoll il-memorja tagħna għal 245 KB kontra 21 MB għal ġestjoni awtomatika. Dan huwa koeffiċjent ta 'kważi 88 ( (20.98 * 1024) / 244.77 = 87.77).
konklużjoni
Għalkemm l-eżempju ta 'hawn fuq imbotta l-ġestjoni tal-memorja sal-limitu, dan it-test huwa maħsub biex jurina kemm jista' jkun. importanti li tistudja l-ġestjoni tal-memorja fl-iskripts tagħna. Il-ħlasijiet jistgħu jkunu impressjonanti f'xi każijiet. Il-ħin tal-ipproċessar, il-memorja u dak kollu li jmur miegħu jistgħu jiġu ffrankati.
Ifhem u uża referenzi
Kif għedtlek ftit qabel, PHP jimplimenta tgħaddi varjabbli b'referenza, u kif għedtilkom hawn fuq dan it-tip ta 'passaġġ huwa bejn wieħed u ieħor ekwivalenti għal passing by pointer.
- Nifhmu pass-by-reference
- Fehim tal-mogħdija tal-pointer
Din hija parti importanti, mhux biss għall-PHP għax dan il-kunċett kien jeżisti ħafna qabel, iżda għall-IT. Bażikament, meta tiddikjara funzjoni, is-silta ssir billi tikkopja.// Għaddi mill-funzjoni tal-kopja pubblika foo($arg) {…}
Dan jimplika xi vantaġġi u liżvantaġġi skond il-kodiċi tiegħek. L-oġġett jiġi kkupjat, li jfisser li l-memorja allokata tiżdied bil-piż tal-oġġett mgħoddi. Dan jista 'jkun redikoli jekk tgħaddi boolean, iżda jista' jkun ħafna aktar importanti jekk tgħaddi firxa per eżempju.
1
2
3
4
5
6
7
8
9
10
11
|
pubblika funzjoni foo() {
$a = 1;
bar($a);
miss $a; //$a huwa 1
}
pubblika funzjoni bar($arg) {
$arg = 2;
}
|
F'dan il-każ, naraw li l-valur ma ġiex modifikat, dan jista 'jkun interessanti jekk nużaw il-varjabbli $a bħala bażi u qatt ma rridu tmissu l-valur tagħha. Nistgħu nitkellmu hawn dwar kunċett li ma jeżistix fil-PHP, ta 'varjabbli kostanti (const).
1
2
3
4
5
6
7
8
9
10
11
12
|
pubblika funzjoni foo() {
$a = 1;
$a = bar($a);
miss $a; //$a huwa 2
}
pubblika funzjoni bar($arg) {
$arg = 2;
ritorn $arg;
}
|
Jien ċert li diġà ktibt metodi bħal dawn. F'dan il-każ, huwa ċar li huwa żball. Naturalment, is-sintassi hija perfettament vera, iżda saret allokazzjoni għall-kopja tal-parametru, u saret id-deallokazzjoni ta 'varjabbli. Sejħiet għaljin tal-memorja u ħin tal-ipproċessar bla bżonn. Il-formola hawn taħt tkun ekwivalenti iżda ħafna aktar mgħaġġla.
1
2
3
4
5
6
7
8
9
10
11
|
pubblika funzjoni foo() {
$a = 1;
bar($a);
miss $a; //$a huwa 2
}
pubblika funzjoni bar(&$arg) {
$arg = 2;
}
|
Hawnhekk wettaqna eżattament l-istess trattament iżda huwa sempliċement aktar mgħaġġel u jikkunsma inqas.
Din l-ottimizzazzjoni hija sempliċi ħafna biex titwettaq u tista 'saħansitra tagħmel il-kodiċi tiegħek aktar faċli biex jinqara. Hemm diversi sintassi li għandek tkun taf tagħmel pass-by-reference.
- Parametru li jgħaddi b'referenza (li għadna kemm rajna)
- Ritorn tal-funzjoni b'referenza (mhux dettaljat hawn, minħabba li l-magna PHP tottimizza din il-parti u ma ħassejt l-ebda gwadann konvinċenti)
- Kopja ta' varjabbli b'referenza, mhux utli ħafna imma formidabbli. Ħallik taqra d-dokumentazzjoni PHP li hija estremament dettaljata. Tista 'faċilment titgħallem affarijiet li ħallejt barra 🙂
Ottimizzazzjoni oħra
Grazzi għat-tliet ottimizzazzjonijiet ta 'hawn fuq, m'għandux ikollok problema biex tħaffef l-ipproċessar tiegħek. Madankollu, hemm oġġetti oħra. Nielenka l-artikoli interessanti dwar ottimizzazzjonijiet differenti li tista 'tagħmel.
- PHP String Concat vs Array Implode
konklużjoni
It-tliet partijiet li għadni kif iddettaljtlek jikkostitwixxu alternattiva tajba għat-togħma tiegħi biex nottimizza l-iskripts tagħha u nevita li terġa’ tibda l-iżviluppi f’ lingwa aktar mgħaġġla bħala lingwa miġbura.
Għamilt dawn it-tliet passes fuq waħda mill-iskripts tiegħi u, fost affarijiet oħra, irnexxieli tnaqqas il-konsum tal-memorja bi 3 bejn wieħed u ieħor u tikseb żieda fil-veloċità b'2.