PHP: For ciklus értékeinek összadása

Sziasztok!

Kis segítséget szeretnék kérni. Van EZ a kód amit úgy szeretnék módosítani, ahogy a kommentelésben is látszik:

Összeadni az összeset, majd abból kivonni a letöltést, és az eredményt a végén egy változó segítéségével printelni a for ciklus után.

(vnstat php frontend)

Hozzászólások

nagy vonalakban: létrehozol egy változót az "összes összes"-re a ciklus előtt, inicializálod 0-val, ciklusonként ez a változó += az aktuális hozzáadandó, aztán a végén kivonás, kiíratás...

[ NeoCalc - Earnings Calculator for NeoBux ]

a $tab[$i]-re mindenképp hivatkozni kell neki valahogy, szóval nem.

azt meg ne higgye senki, hogy foreach-nél "kevesebb változója" lesz, a különbség csak annyi, hogy nem te majomkodsz vele, hanem az interpreter, cserébe jó eséllyel erőforrás-pazarlóbb lesz...

[ NeoCalc - Earnings Calculator for NeoBux ]

Epp azt csinaltam, hogy ellenorrizzem, meghibbantam-e, de szerencsere nem:
100 000 elemu tombon (az elemek intek 1-100000 ig):
- maszas foreeach -csel:

real 0m1.466s
user 0m0.320s
sys 0m0.396s
6651904 maximum resident set size
1710 page reclaims

- maszas for-ral:
real 0m1.697s
user 0m0.421s
sys 0m0.462s
6651904 maximum resident set size
1710 page reclaims

Sz'al szerencsere meg eszemnel vagyok, a vilag normalis, csak hulyesegeket mondanak emberek.

(Esetunkben) azonos memoriafoglalas, gyorsabb futasido foreach-csel.

Tényleg nem tudom, hogy a php hogyan valósítja meg a int-indexű dinamikus tömbjeit, de ha nem újraallokálgatással a létrehozás során, akkor valamilyen listával/fával, és ha úgy, akkor minden i indexű elem eléréséhez legalább 2 elemet kell érintenie, míg a végignyaláskor (foreach) pontosan egyet.

a foreach gyorsabb nem vitás. Én fent arra céloztam, hogy a for ciklus kilépési feltételét elég egyszer kiszámolni, így:


for ($i=0, $max=sizeof($tab); $i<$max; $i++) // ~70%-al gyorsabb

és nem így:


for ($i=0; $i < sizeof($tab); $i++) // minden iterációban megnézi a méretet ... ezesetben felesleges+idő

Közben kiváncsi voltam az 5.3asban elérhető lambda függvénnyel mire lehet jutni egy tömb esetében.

Kb. 20%al lassabb mint egy foreach. Az alapesetben elemenként maxot számolgató for ciklust veri. Viszont plusznak ott van a closure környezet számítások végzésekor, algoritmizálására. Így már elég király az eredmény.

Mivel a foreach nem kap indexet, aminek típusát vizsgálnia és esetleg kasztolnia kellene, hogy indirekt címre alakítassa (ha hash-sel dolgozik, akkor annak algoritmusa miatt még rosszabb), hanem de facto egy listán feltétel nélküli végigsétálást eredményezi, valószínűleg éppen az a gyorsabb - még ha ez mai gépteljesítménnyel esetleg kimutathatatlan is.

A fenti bizonytalan kijelentésekből talán látszik, hogy a php-t kifejezett érdeklődés hiányában csak ugatom, de kétlem, hogy a belső implementáció nem a vázoltak valamelyike volna.

Figyu, egy kis idot eltoltesz dinamikus nyelvekkel - neha viccesen azt irtam be helyekre, hogy "dynamic language architect", amikor a pitontol a php-n at a js-en keresztul a ruby-ig mindenfele nagyrendszerhez nekem kellett hozzaugatni, mert a Nagy Java Architekteknek leesne a gyuru az ujjarol, ha nem lennenek kiirva vegig a tipusok - akkor rajossz, hogy nem igazan gyors az interpretalt terben futtatni azokat a dolgokat amiket nem muszaj - pl. kezzel iteraciot implementalni.

zavarta a szememet a kod, ez volt az elso, ami szembejott. felesleges oda a $i, mint lentebb bebizonyitottak, gyorsabb is foreach-el, en ezt elhanyagolhatonak tartottam benchmark nelkul, csak belefutottam abba, hogy foreach-el egyszerubb, es szebb lett volna. a helyes valaszt pedig mar beirtak felettem: $sum = 0; foreach($array as $item) { $sum += $item; }, vagy valami ilyesmi
--------------------------------
http://r1pp3rj4ck.wordpress.com/