Php 5.3 hibát dob
Sziasztok!
Van egy idegesítő dolog a php 5.3-ban.
Megtaláltam itt a megoldást rá. Vagyis azt magyarázzák, hogy ez nem bug stb... Viszont nem értem, hogy akkor hogyan lehet megszerelni :-)Egyelőre nem értem, hogy ez mit jelent :-P
Mmint eddig úgy volt, hogy a tömböket és stringeket másolta a php (ami szerintem alapból marhaság), php5-ben volt annyi eszük, hogy az objectekre beszűntették ezt a dolgot.
Én egy hasonló függvényben, mint a fenti szeretnék átadni stringet, és nem szeretném, ha másolná a php, mert az lassít. A dolog viszont nagyon nem akar menni. Elvileg azt javasolták, hogy &-et kell tenni a paraméter elé függvény hívásakor, viszont akkor a deprecatedes hibaüzenetet kapom. Ha nem teszek &-et, akkor meg a warning nem engedi lefutni a függvényt.
Most akkor hogy lehet megoldani, hogy ne másolódjon a paraméter, és minden rendben menjen?
■ Van egy idegesítő dolog a php 5.3-ban.
Megtaláltam itt a megoldást rá. Vagyis azt magyarázzák, hogy ez nem bug stb... Viszont nem értem, hogy akkor hogyan lehet megszerelni :-)
function pass_by_reference( &$param ) {
$param[] = "another entry";
}
$data = array( "a first entry" );
call_user_func( "pass_by_reference", $data );
//Warning: Parameter 1 to pass_by_reference() expected to be a reference, value given in test.php on line 234568
var_dump($data);
// $data contains only one element ( "a first entry" )
$data = array( "a first entry" );
call_user_func( "pass_by_reference", &$data );
// Warning: Call-time pass-by-reference has been deprecated - argument passed by value
var_dump($data);
// $data contains both elements ( "a first entry","another entry" )
Mmint eddig úgy volt, hogy a tömböket és stringeket másolta a php (ami szerintem alapból marhaság), php5-ben volt annyi eszük, hogy az objectekre beszűntették ezt a dolgot.
Én egy hasonló függvényben, mint a fenti szeretnék átadni stringet, és nem szeretném, ha másolná a php, mert az lassít. A dolog viszont nagyon nem akar menni. Elvileg azt javasolták, hogy &-et kell tenni a paraméter elé függvény hívásakor, viszont akkor a deprecatedes hibaüzenetet kapom. Ha nem teszek &-et, akkor meg a warning nem engedi lefutni a függvényt.
Most akkor hogy lehet megoldani, hogy ne másolódjon a paraméter, és minden rendben menjen?
-----------
:?
2. Egy oldalletöltésnél hányszor hívod meg átlag így a fv-eket?
3. Megmérted, hogy mekkora "lassulást" is okoz az általad vázolt probléma? Nem idealizált tesztekre gondolok, hanem százalékosan egy komplett oldal betöltése (képekkel, CSS-sel, js-sel, teljes rendereléssel) mennyivel is lesz lassabb?
4. Nincs más mód a fv hívogatására?
Talán a harmadik a legfontosabb kérdés. Mert ha az jön ki, hogy egy oldal betöltése mindennel együtt 1 másodperc, te meg egy 3 ms-os gyorsításról beszélsz, akkor sztem gondold újra, hogy érdemes-e az életedből akár 1 percet is arra szánni, hogy ezt az égető problémát megold...
Leegyszerűsíted.
Szóval gyakorlatilag megmondtad a semmit.
khm
...
Mondjuk attól még érdekelne, hogy miért nem lehet mindezt elintézni a call_user_func-al, amikor php 5.3-ig még simán ment. Jobban tetszene, ha nem változtatnának minden verzió után. Elég lenne egyszer jól kigondolni.
:?
Vannak problémák, amiket nem kell megoldani VAGY eleve vannak rá más megoldások és nem kell azon az úton erőltetni. Erre próbáltalak rávezetni.
Arról nem is beszélve, hogy te itt optimalizálásról beszélsz, holott a call_user_func() megoldás közel 2-szer olyan lassú, mint ha natív hívod a fv-t, tehát ha ennyire a teljesítményre hajtasz, akkor még olvasgass egy-két benchmarkot... A végül talált megoldásod már csak 10-20%-al, de azt le kéne mérni, hogy ez most mennyit is jelent kombinálva a változó másolgatás elkerülésével.
Egyébként meg nem biztos, hogy be kéne szólogatni, mert az elég paraszt viselkedés, és nem biztos, hogy segíti a későbbi segítségnyújtást.
ofc
Nyilván én meg okkal használtam azt a függvényt. Az objektum és a metódus is változó benne, más út pedig nincsen a megoldásra a PCRE motor hibája miatt. Egy ilyen egyszerű problémánál nem fogom elkezdeni magyarázni 1000 sor kód működését, mert semmi köze a dologhoz.
A cuccot nem mértem le, hogy mennyi lassulást okoz, mert nekem ezred másodpercek is számítanak. Egyelőre meg nem vallom azt a nézetet, hogy először írjuk meg a programot, aztán utána kezdjünk el optimalizálni, mert php-ben nincsenek meg ehhez az eszközök.
A call_user_func egy foreach-ben van/volt, ebből adódóan elég gyakran meghívom. A foreach egy template compiler token feldolgozója. Mélyebben nem megyek bele.
Nem baj, én szeretek beszólogatni.
korai optimalizáció, bottleneck
"Premature optimization is the root of all evil"
Ugyan miért nincs meg a kései optimalizációnak a lehetősége PHP-ben?
Valamint ha nem mérted le a kódot, _teljesen_ felesleges ilyen apróságokkal bajlódnod első körben. Ott tudsz a legtöbbet nyerni, ahol a legtöbbet veszítesz. Fogj egy xdebugot és mérd szépen le.
Blogmark volt, talán érint: The truth about php variables
És hogy ne csak a semmit mondjuk, ha leméred a kódot, kérlek oszd meg velünk, hogy mennyit nyertél ezen a problémán, köszi.
Kösz
Magát a & nélküliséget nem mértem le, mert kb 15-20 helyen kéne átírnom különböző fájlokban függvényeket, ehhez meg lusta vagyok egy mérés miatt. Számomra egyébként lényegtelen, hogy mit mérnék vele, tudom, hogy gyorsabb lesz tőle a kód. A dolog megítélése meg szerintem téves, mert nem tartozik az optimalizáláshoz. Gyakorlatilag egy paramétert adok tovább a feldolgozó függvényig. Teljesen mindegy, hogy módosul e az eredeti, mert csak és kizárólag a feldolgozó függvény használja, más nem. Szóval inkább tervezési kérdés, mint optimalizálási.
Hmm
Az általad felvázolt szemléletmódban már eljutottam a 4-es pontig, amikor feltettem a kérdést. Ezért gyakorlatilag semmi újat nem mondtál. Egyébként meg nem érdekel, hogy szerinted beszólás vagy sem.
ezt próbáltad?
Nem próbáltam.
???
Amit most írtál - array($object,$method) - az nem szerepel a kódodban sehol, így nem tudom beazonosítani.
Callback paraméter
Egyébként ez a függvényhívás
szerk:
Jah, kipróbáltam, működik. Kösz a segítséget.
a php, illetve a zend engine
http://www.trl.ibm.com/people/mich/pub/200901_popl2009phpsem.pdf
ez alapjan szerintem minimalis overheadje lehet az ertek szerinti atadasnak a referencia szerintivel szemben.
sot, http://www.thedeveloperday.com/php-lazy-copy/ itt azt irjak, hogy adott esetben a referencia szerinti parameter atadas pont emiatt meg lassabb is lehet.
Tyrael
Hmm
Eredmény
Körülbelül 10-15 ilyen paraméter átadás hoz az én gépemen 0.1 msec gyorsulást.
Így lett a 2.7 msec-es programból 2.5 msec-es. Szóval érdemes használni.
A különbség egyértelműen az érintett függvényekből jön ki.
Ami miatt rühellem az xdebugot, hogy 0.1 msec alá képtelen bemenni, így kb 90%-a a függvényeknek nem vizsgálható.
Microtime-al lehetne mérni egy teszten, de azt meg bárki megcsinálja.