PHP - Copy on write
Pepita hozzászólása
■ Blaze, elnézést kérek, de én akkor sem értek egyet a copy-on-write-al, és itt nem kívánom tovább vitatni, lévén - ismét jelzem - js a témakör.
H | K | Sze | Cs | P | Szo | V |
---|---|---|---|---|---|---|
24 | 25 | 26 | 27 | 28 | 1 | 2 |
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 | 1 | 2 | 3 | 4 | 5 | 6 |
Link?
done
Es mi itt a kerdes?
Becopyzhatom az egész
Pro és kontra copy on
Enélkül sok esetben felzabálná a memóriát, a referencia szerint átadogatás mindenhol , kisebb meglepetéseket okozna ha más is használná a kódbázist.
Te zabáltatod fel
Úgy látom az a baj, hogy a PHP-t használók többsége nem képes átlátni a memóriahasználati problémákat, és a PHP fejlesztői úgy döntöttek, hogy megpróbálják megtanítani a PHP-t helyettünk figyelni. Hát ez rossz döntés volt szerintem.
A "más is használja" részt kifejthetnéd bővebben, nem értem mi a problémád. Van aki nem ismeri fel az
&
jelet? :)Mi lenne akkor a
Vagy referenciaként adsz át mindent, mint típusos nyelveknél, vagy megerőszakolod a nyelvet és mindenhova odaírod a & jelet.
Ha téged zavar a copy on write, ott van megannyi nyelv még amivel weboldalt lehet fejleszteni. Nem hiszem, hogy ez a működés változni fog a PHPnál.
A más is használjánál arra gondoltam, hogy ha használsz mások által írt fveket, feltételezed, hogy érték típusokat nem referenciaként adogat át, és hirtelen valamelyik kis függvény útközben megváltoztatja az értékét. Pl. egy string futás közben megváltozik vagy boolean érték...eléggé wtf lenne debuggolni.
Az, hogy én döntök
Köszi, inf3rno,
A lényeg az részemről, hogy szerintem bár sok programozó ill. team életét megkönnyíti a copy-on-write, mégis, nem véletlen, hogy több nyelvben nem alkalmazzák, részben a többletmemória, részben az egy feltétellel több művelet miatt.
Emiatt én sajnálaom, hogy a PHP-ban van, megszoktam, hogy én döntöm el, mikor adok át értéket és mikor referenciát. Lehet a referenciaátadás ellen "kampányolni", de szerintem egy teamben sem okozhat önmagában gondot, ha megfelelő fejlesztők alkotják.
Szerintem egyáltalán nem ördöngösség referenciákkal "bűvészkedni", aki nem tud, az adjon át értéket és pont. Ezen feleslegesen "dolgozik" a PHP, ez inkább olyan Pistikés "gondolkodik helyettem" dolog. Aztán mikor nem úgy jön ki, nem is tudom, hogy mi a baj, mert nem az történt, amit a szoftverembe írtam.
Szerintem nem sok értelme van vitatkozni erről, mert véleményes a dolog - az biztos, hogy sok esetben több művelet és RAM, innentől már mindegy is, hogy mennyivel több. Ha nem igénylem ezt a "szolgáltatást" (nem használom ki), akkor ezeket az erőforrásokat az ablakon dobta ki.
Simán lehet, hogy egyedül vagyok a véleményemmel, de én erősen típusos nyelveken nőttem fel, a commodore-ok világában pedig szó sem volt referenciákról, hanem konkrét (abszolút) memóriacímekről, ahova közvetlenül írtál vagy olvastál, néha pedig csodálkoztál, hogy most miért kell megint a reset gombot megnyomni...
Ehhez képest nekem ez a "segítség" kissé gyerekesnek tűnik, de az szóljon, aki komoly előnyét fel tudja mutatni, hátha csak én nem vizsgáltam meg elég alaposan a kérdést.
A copy-on-write nem az
Delphi?!
Mert az, hogy (delphiben) több mutató is mutathat ugyanarra az adatra (objektumra), nem jelenti azt, hogy másolatot készített róla. Erről delphi esetében soha nem olvastam, c++-ban nem tudok nyilatkozni. A delphi akkor készít másolatot, ha értéket adsz át - tehát megintcsak egyértelműen te csináltad, nem helyetted a fordító.
De ha csak én nem olvastam róla, és valóban a számomra "szebb" nyelvek is alkalmazzák (eddigi tudtom nélkül), akkor igencsak kénytelen leszek megbarátkozni vele, kissé késve bár, "de törve nem". :)
Link
Köszi,
A PHP esetében is az a bajom vele, ha egy komolyabb osztályom példányát másolja le, az memóriakidobás. Ezért is szeretek ilyesmit, vagy nagyobb eredményhalmazt referenciaként átadni.
A PHP a referenciát másolja
Nem, eddig volt copy-on-write
Objektumokat meg nem másolgatunk le hívásnál, annak úgy nem lenne sok értelme. Azon felül, hogy újra hamar az informatika kőkorszakában találnánk magunkat a teljesítményt tekintve.
szóljon, aki komoly előnyét
Azért nem szeretjük a referencia szerinti átadást, mert nem teljesül vele az adatrejtés az encapsulation-nél.
Szerintem nagyon kényelmes, hogy nem kell azzal foglalkoznom, hogy referenciát adjak át, mert túl sok memóriát zabál a program. Ha valami túl sok memóriát eszik, az meg úgyis előjön az optimalizálási fázisban, kiírja az xdebug, aztán lehet válogatni, hogy átírjam az algoritmust, vagy referencia szerint adjam át, stb... Én nem szeretem bonyolítani az életemet, ha nem szükséges, és a referencia szerinti átadás nálam alapból túlbonyolítás, mert az esetek döntő többségében szükségtelen. Ennyi a véleményem róla.
Köszönöm a véleményed,
Mindenesetre az is igaz, hogy a kedvemért nem fog a PHP másképp működni, úgyhogy ha használni akarom, akkor alkalmazkodnom is kell ehhez.
Az adatrejtésnek is megvannak az előnyei, de meg lehet oldani másképp is, de ez már túl hosszú lenne. A te szemszögedet jól értem, és talán nem túl nehéz legalább részben egyetérteni vele.
A tudatlanság nem vélemény.
Refcountingot használó nyelvekben
Egyébként ha kiváncsi az ember arra, hogy hány referencia mutat 1-1 zvalra debug_zval_dump akkor vagy ha telepítve van xdebug extension, akkor xdebug_debug_zval-al ezt ki lehet irtatni.
Ismét figyeltél
Tehát minden más esetben automatikus menedzselésről beszélünk, ha figyelted (volna) a fentebb említett Delphi verziókat, látnád, hogy nem a levegőbe beszéltem.
Magyarul: jobbnak tartom megmaradni a véleményes jelzőnél a tudatlanság helyett. Annál is inkább, mert ha visszadebugolod a Delphit, láthatod: nincs kismillió referencia ugyanarra a vezérlőre... De egy-két alapművelettel anno ki is próbáltam, hogy mit jelent futásidőben a különbség egy Delphiből fordított .exe és a PHP közt, de sajnos ezeket eldobtam, mert csak alapképességek szintjén rápillantottam, hogy legyen egy pici fogalmam róla. Persze ez nem is a legjobb összehasonlítás, mert míg egy Delphi alkalmazás legtöbb esetben egy asztali (laptop) gépre szánt alkalmazás, addig a PHP-ben írtak többnyire "kicsivel nagyobb vason" futnak. Ez viszont nem jelent egyet az erőforrások gátlástalan pazarlásának megengedettségével.
Ha összehasonlítod inf3rno hozzászólását a tiéddel, azt hiszem számodra is szembetűnik: ő mennyire konstruktívan, te pedig mennyire destruktívan állsz a véleményemhez, pedig valahol hasonló véleményen vagytok, csak a megfogalmazás különbözik erősen...
Ha valakinek a véleménye
1. automatikus memóriamenedzselés (ebben a kontextusban) az, amikor a fordító vagy a futtatókörnyezet elvégzi a memória foglalását és felszabadítását, és nem neked kell kézzel. (Vö. Automatic variable, bár a változókezelés csak egy része a dolognak.) Vashoz közelibb nyelvekben, mint a C++ vagy a Delphi, részben automatikus csak a memóriakezelés: a referenciaként átadott objektumoknál nem az, a programozó felelőssége lefoglalni és felszabadítani (ezért kapsz memory leaket, ha nem használod a free operátort). Scriptnyelvekben minden memóriát a fordító/VM kezel.
2. Delphiben egyébként a sztringek automatikusan menedzseltek, referenciaszámlálással, és azoknál van is copy-on-write. (Pontosabban attól függ, melyik Delphiről van szó; lásd pl. ezt a cikket.)
3. Mindez egyébként mellékszál: az állítás az volt, hogy azoknál a nyelveknél (és a PHP ilyen), amik automatikusan menedzselik a memóriát az objektumok számára, a referenciaszámlálás ingyen van, tehát ha nem copy-on-write szemantikát használnának, semmivel sem lennének hatékonyabbak, viszont triviális műveletek is vagy memóriapazarlással vagy az alapvető objektumorientált elvek sérülésével járnának.
Szerintem alapvetően nem érted, hogy működik ez az egész: referencia-szemantikánál van egy objektumod, meg van egy mutatód, és a mutatót lemásolod minden alkalommal, amikor az objektumot át kell adni valahogy. Copy-on-write szemantikánál van egy objektumod, van egy mutatód, van egy számlálód, hogy hány mutató van összesen az objektumra, ugyanúgy csak a mutatót másolod le minden alkalommal, és amikor módosítod az objektumot, akkor ha a számláló értéke 1, akkor simán módosítod az objektumot, ha nagyobb, akkor csökkented 1-gyel a számlálót, lemásolod az objektumot, 1-re állítod a másolat számlálóját és átirányítod rá a mutatót (és csak ezután módosítasz). Többnyire pont ugyanazokat a műveleteket fogja elvégezni a fordító, mint referenciaszemantikánál, csak a másolás később történik, amikor már biztossá válik, hogy szükség van rá.
Így már világos,