Un array multidimensional poate avea probleme de performanță?

Folosesc ACF pentru multe lucruri în WP, iar una dintre problemele cele mai mari ar fi că administrarea câmpurilor poate deveni extrem de ușor aglomerată și foarte greu de administrat. Mă rog, pentru cei ce nu sunt familiari cu ACF este suficient de menționat că acesta exportă un array multidimensional destul de… generos:

În fine, acum ajung la problema care mă roade: pentru a trece de panoul de administrare (ăla stufos, mai sus menționat), am făcut câteva clase PHP care, într-un fel sau altul, scuipă cam același array. Nu folosesc cine știe ce logică complexă, abia am câteva condiții, câteva preg_match și preg_split cu niște pattern-uri foarte simple și multe array_merge. Practic la fiecare field am un array_merge.

În acest moment, la modul în care mă pricep eu să măsor, pe mașina de dev nu se observă nici o problemă cu performanța, dar nu e chiar cea mai bună modalitate de măsurare, având în vedere că am maximum un vizitator și doar dummy data în DB (deci foarte puține intrări) :smile:

Întrebarea mea este: ar trebui să-mi fac probleme pe viitor? Există posibilitatea ca lucrurile să o ia razna și să văd spike-uri dubioase?

Cum aș putea măsura impactul acestor operațiuni?

load -> profile -> measure. repeat.

Tocmai, că am făcut asta și nu am rezultate concludente. Dar sunt într-un punct în care nu am foarte multe date, nu am vizitatori iar array-ul încă este mic (estimez că e un sfert din cât că va fi în final).

Profiling în acest punct nu este foarte relevant și aș vrea ceva feedback de la cei mai experimentați, să pot aborda altfel situația dacă este cazul.

In opinia mea exemplul prezentat este destul de simplu, pare a fi mai mult o micro-optimizare, am vazut in Magento array-uri mult mai complexe care se iterau de cateva ori per request si response time-ul era sub 60 ms.

2 Likes

the golden rule: til you actually measure all can be deceiving :sunny:

2 Likes

Eu cred in masuratori. M-au salvat de multe ori.
Totdeauna am incercat sa “pun in cap” masina de dev prima, macar sa stiu la ce sa ma astept. Nu de alta, dar in al 2lea meu an de vitejii eram 33 developeri care lucram remote pe un monstru de dev machine si l-am killerit cu ceva batch processing care pierdea memorie, si am stat toti pana am recuperat accesul.
Revenind, pentru lovirea nemiloasa intr-o masina de dev in mod deosebit recomand siege sau macar Apache benchmark, si evident monitorizarea in timp real la un nivel basic. La siege e super fain ca poti da o lista de url-uri pe care sa le crawluiasca si in felul asta poti vedea care din ele e buba. Dupa ce ai identificat o buba sau mai multe, recomand profiling cu blackfire pentru elucidarea misterului.

Putin off-topic (dar nu am timp sa detaliez): da, array-urile multidimensionale sunt un PITA dpdv al performantei.

1 Like

Din păcate array-urile nu sunt chiar o opțiune. Sunt impuse de pluginul sufletului.

Eu îmi fac probleme de generarea array-ului, care se face făcea la fiecare pageload.

Între timp am scris un utilitar ce-mi scrie tot array-ul ăla într-un format asemănător cu export-ul. Acum orice probleme de performanță pică în cârca pluginului.

@tekkie wrk + Lua and you can bring down any app ^ ^

2 Likes

Foloseste import/export de json (acf v5) pe care il tii sub git, numai bine ai si control din interfata asupra field-urilor

Păi tocmai, pentru că fac field-urile manual, import/export nu funcționează :smile:

În plus, chiar dacă ar funcționa, este foarte aiurea să fac export/import manual la fiecare modificare a câmpurilor.

Dar presupunând că ar o soluție, tot ar trebui parsat din json în array și apoi procesat, deci nu ar fi o treabă.

Incearca sa:

  • stockezi intr-un cache
  • accesezi array-ul dupa index (nu dupa valoare / search)
  • folosesti “square brackets syntax” in loc de array_merge (asta daca nu ai nevoie sa faci overwrite la index la merge)
  • stockezi valoarea array-ului sub forma de INT acolo unde e cazul (nu string ca aici … ‘value’ => ‘100317’, …)

Array-ul tau nu este chiar atat de mare precum crezi :smile: probabil ca de la cateva sute de mii de key / valori in sus ai putea sa incepi sa iti faci probleme. Referitor la consumul de memorie mi-am amintit de un articol mai vechi: http://we-love-php.blogspot.ro/2012/06/php-memory-consumption-with-arrays.html

1 Like

json_encode si json_decode sunt in top 1% cele mai rapide functii ale php-ului. Masurat personal. Nu de ele sa iti fie frica :wink:

Ah, nu asta era problema. Problema ar fi că ce rezultă din json_decode tot array se numește.

Din codul meu trebuie să rezulte array-uri ca cel din exemplul de mai sus. Nu pot schimba, nu pot ajusta :smile:

Eu îmi făceam probleme pentru că am scris câteva clase care generează acele arrays live, deci pentru generarea lor îmi făceam griji (dar am rezolvat, cât sunt în dev mode scriu într-un fișier, când nu sunt în devmode, citesc doar acel fișier și sar peste clasele mele).

1 Like

reading file + parsing the data << just generating the data?