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)
- 2313 megtekintés
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...
- A hozzászóláshoz be kell jelentkezni
Érdekes adatok jönnek ki így...
=> Ubuntu User <=
- A hozzászóláshoz be kell jelentkezni
te akarod összeadni...
- A hozzászóláshoz be kell jelentkezni
nem teljesen világos a szándékod, de ha a kivonni kívánt letöltés is aggregált, akkor nyilván arra is kell egy külön változó, amit ciklusonként növelgetsz, és a végén ezt vond ki a másikból...
- A hozzászóláshoz be kell jelentkezni
nem lett volna egyszerubb egy foreach?
--------------------------------
http://r1pp3rj4ck.wordpress.com/
- A hozzászóláshoz be kell jelentkezni
jelen esetben miért lett volna az?
- A hozzászóláshoz be kell jelentkezni
mert akkor egy valtozoval kevesebb lett volna ($i), es a hivatkozas is konnyebb lett volna, tovabba a kod is szebb lett volna.
t
- A hozzászóláshoz be kell jelentkezni
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...
- A hozzászóláshoz be kell jelentkezni
errgh.. miert kene hogy eroforraspazarlobb legyen egy belso terben futo iteracio a kulsonel? Gyorsabban kene vegeznie es ugyanannyi valtozoval max.
- A hozzászóláshoz be kell jelentkezni
hát pl. azért, mert univerzálisabbnak kell lennie. az asm-ben írt helloworld szerinted miért hatékonyabb, mint a c-s? :)
- A hozzászóláshoz be kell jelentkezni
oke, de itt arrol beszelunk, hogy van egy alapvetoen interpretalt terben futo for ciklus, meg van egy, ami c-ben fut, es minden egyes iteracioban meghiv egy (interpretalt) callback-et. Vajon melyik a gyorsabb?
- A hozzászóláshoz be kell jelentkezni
mérd le, és kiderül.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
oké, akkor mea culpa, a foreach über. persze ez az eredeti problémán nem sokat segít :)
szerk: mondjuk annyit hozzátennék, hogy nem tényként állítottam be a "hülyeséget". ha jobban megfigyeled, annyit írtam, hogy "jó eséllyel"...
- A hozzászóláshoz be kell jelentkezni
Upsz, látom, a világ már előttem jár pár lépéssel. :)
- A hozzászóláshoz be kell jelentkezni
hamár homár.. az a for ciklus ott döglik meg, hogy minden iterációban kiszámolja a tömb méretét, aminek nincs értelme de esetedben legalább 100.000 alkalommal lassít :)
- A hozzászóláshoz be kell jelentkezni
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 hozzászóláshoz be kell jelentkezni
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ő
- A hozzászóláshoz be kell jelentkezni
Jaja, korrekt, csak ehhez tettem hozzá, hogy az sem mindegy, hogy egyszer ugrunk neki az adatszerkezet fejének, vagy százezerszer.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
Kb. éppen ez a gondolat - hasonló munkatapasztalatok után - vezetett a hályogkovácsos tippemre.
- A hozzászóláshoz be kell jelentkezni
Mert akkor az $i változóra nincs szükség; a hivatkozás könnyebb, a kód pedig szebb lett volna.
t
- A hozzászóláshoz be kell jelentkezni
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/
- A hozzászóláshoz be kell jelentkezni
de ez nem jó, hiszen "érdekes adatok jönnek ki így" :D
- A hozzászóláshoz be kell jelentkezni
akkor probalja meg papiron :D
--------------------------------
http://r1pp3rj4ck.wordpress.com/
- A hozzászóláshoz be kell jelentkezni
.
- A hozzászóláshoz be kell jelentkezni