» »

java i++ ali ++i v for zanki

java i++ ali ++i v for zanki

l0g1t3ch ::

Zanima me če je kakšna razlika med
for (i=1; i<10; ++i)

for (i=1; i<10; i++)



ali je to samo stvar navade pisanja kode. Sicer sem zadeve testiral in nisem najdu nobene razlike me pa vseen zanima če obastaja kaka in je možno da kaj nebi delal prov če spremenim iz ++i na i++

isto me zanima za --i in i--

luli ::

Za for zanko nisem siguren, ampak razliko se najlepše opiše na tem primeru

a=5

če izpišeš s cout a++ se bo izpisalo 5, po končanem stavku pa se bo a nastavil na 6, medtem ko če izpišeš ++a se bo a najprej nastavil na 6 in šele potem izpisal.

Vsaj mislim, da je tako. Naj me kaki navdušenec c++-a popravi, če sem v zmoti!

kihc ::

kot je reku luli, probej v javi tole:

int i = 0;

System.out.println(i++);

i = 0;

System.out.println(++i);
x

A. Smith ::

Tukaj pravijo, da pri for zanki ni razlike.
"Be professional, be polite,
but have a plan to kill everyone you meet".
- General James Mattis

jan01 ::

Sem hotel napisati en kratek program z razlago, a ta smotani, zastareli forum ne pusti objeave...

l0g1t3ch ::

vem za to d ++i prvo priredi in pol uporabi, i++ pa prvo uporabi in pol priredi. To mi je jasno.

Zanima me zgloj in samo za primer zanke. Kolikor sm probaval razlik ni. Edino kar sem zasledil naj bi v C++ bil hitrjši ++i kot i++

sverde21 ::

Pri for zanki ni razlike. Drugače pa razlika je če maš recimo en račun:
int i = 1;

// operator ++ ima največjo prioriteto in zato se bo najprej izvedel,
// šele potem se bodo upoštevali drugi operatorji (najprej * potem +)
r = 3 + 2 * ++i;
// r = 3 + 2 * 2;
// r = 7;

i = 1; // nastavimo i spet na 1

// izraz se izvede kot da operatorja ++ sploh ni, i se poveča šele ob
// zaključku tega stavka (pred podpičjem je i= 1, za podpičjem i = 2)
r = 3 + 2 * i++;
// r = 3 + 2 * 1
// r = 5


EDIT: Nima veze, če je program hitrejši za tistih par nanosekund, saj ne bo noben opazil, važno je da je koda berljiva in da dela tako kot mora... Aja, pa jaz še v življenju nisem videl da bi kdo pisal for zanko z ++i.
<?php echo `w`; ?>

Zgodovina sprememb…

  • spremenil: sverde21 ()

l0g1t3ch ::

mnja jest mam pa polno kode iz faksa kjer profesor veselo piše ++i oz --i in me blazno moti :\

moowy123 ::

Sicer programiram šele 5 let, ampak sem že dostikrat videl na internetu for zanko z ++i zapisom tako, da to ni tako neobičajna stvar... :D

Vesoljc ::

stevec v for zanki se poveca po koncani iteraciji zanke, ali se poveca kot ++i ali kot i++ je pa ocitno (pa tudi logicno ne?) vseeno.
Abnormal behavior of abnormal brain makes me normal...

BigWhale ::

Vesoljc,

Logicno bi bilo, da ++i poveca stevec preden izvede zanko, i++ pa sele potem, ko jo izvede. Ampak razlike neke bas ne bi bilo, le v zacetku zanke, ko incializiras stevec.

Mislim, logicno...

'FireSTORM' ::

BW, niti ne, saj je nekako "določeno" da se "zadnji stavek" zalaufa pred koncem zanke.
Torej je enako kot:
while(pogoj)
{
  bla bla;
  i++;
}
// Ali
while(pogoj)
{
  bla bla;
  ++i;
}


Seveda pa je vseeno, ker for zanka ne povečuje i-ja nič drugače kot sem ga tukaj v while zanki.
Those penguins.... They sure aint normal....

Zgodovina sprememb…

Jean-Paul ::

Naslednje velja za C++ (za Javo nisem prepričan)!

i++ in ++i se izvedeta enako hitro, če je i osnovnega tipa. V primeru, ko je i objekt nekega razreda, pa se lahko ++i izvede enako hitro kot i++ ali hitreje, a nikoli počasneje.

Glej c++-faq-lite

sverde21 ::

mnja jest mam pa polno kode iz faksa kjer profesor veselo piše ++i oz --i in me blazno moti :\

Verjamem ja, mene bi tudi motilo.
Sicer programiram šele 5 let, ampak sem že dostikrat videl na internetu for zanko z ++i zapisom tako, da to ni tako neobičajna stvar... :D

No, zna biti da je to odvisno od jezika, namreč jaz sem bolj doma v PHP-ju in tam ++$i malce čudno zgleda IMO.
<?php echo `w`; ?>

fiction ::

Mislim, da je skoraj vsem jasna razlika:
int i = 1;
System.out.println(i++); //izpise 1 ter poveca i
medtem ko:
System.out.println(++i); //poveca i ter izpise 2

Samo v for zanki kot inkrement pa med i++ in ++i ni nobene razlike
(v koncni fazi se oboje prevede v nek INC-u podoben ukaz).
Razen, ce se na podlagi i-ja ne spreminja se kaj drugega (kar pa
ponavadi ni ravno smiselno).

Fora je samo v tem, da recimo v C++ ++ lahko definiras kot operator za svoj objekt.
Pri ++i rabis samo povecano verzijo objekta, medtem ko moras za i++
nekje vse skupaj povecati (na nek nacin pac), poleg tega pa voditi se zacasno verzijo
starega i-ja s katerim se lahko racuna, ce je se treba se kaj racunati.
Zaradi tega naj bi bilo ++i hitreje (ker pac ni potrebno vzpostaviti dveh kopij
- pri stevilih ves da sta povecanje oz. zmanjsanje za 1 trivialni operaciji in jih
lahko po potrebi uporabljas, medtem ko za objekt taka operacija lahko pomeni dolgotrajno
racunanje in nujno rabis narediti takoj zacasno kopijo).

Optimizator prevajalnika bi najbrz lahko to preprecil in naredil
ekvivalentno kodo v obeh primerih. Ampak glede na to, da ne gre za tako
grozno spremembo v stilu (ne vem zakaj te to tako moti?), sem se tudi jaz
navadil kar pisati ++i namesto i++.
Nekako tako kot je fino pisati blok - {} tudi ce imas samo en stavek.

Pri PHP-ju, ki se interpretira je vse skupaj bolj pomembno (ceprav ne ravno
tako kriticno, da bi bilo zato treba spreminjati kodo - razlika je minimalna).
http://ilia.ws/archives/12-PHP-Optimiza...
Kolikor sem slisal dejansko Zend Optimizer naredi to transformacijo na bytecodu
(in kvazi spremeni $i++ v ++$i), nisem pa sel podrobneje preverjati vsega skupaj.

sverde21 ::

V vsakem primeru se moraš zavedat, da se tistih par nano ali mili sekund ne bo poznalo napram kakšni poizvedbi v bazo. IMHO tudi če uporabiš ++i pri števcu v kakšnem sorting algoritmu (kjer se zadeve precej zankajo) čas izvajanja pri sortiranju recimo 2^8 random elementov ne bo kaj boljši od časa pri uporabi i++.

Sem naredu tud en benchmark v PHP-ju ( source). Rezultati so precej random, včasih je $i++ hitrejši od ++$i, včasih je obratno...
<?php echo `w`; ?>

fiction ::

Seveda to ne bo neka jaka pohitritev (vsak query traja dalj casa) pa tako ali tako bo to samo za
konstantni faktor. Bolje se je ukvarjati s samim algoritmom in recimo pohitriti asimptoticno
zgornjo mejo casovne kompleksnosti ter tako spremeniti stvar iz O(n^2) v O(n) ali kaj takega.
Ampak po drugi strani te pa drugacen stil tudi nic ne stane.

Ce ze delas nek benchmark, naredi samo za for zanko in ne na silo implementirati nekega
use-casa, ki je itak totalno brezvezen.
Poleg tega se mi zdi, da dvakrat klices isto funkcijo bubbleSort1(), paziti moras
pa tudi na to, da drugic ne dobis ze posortiranih podatkov v ponovno sortiranje.

Ker je v $s_array kopija od prej, sem mislil da bos namesto $s_array = $array;
v 52 vrstici naredil $array = $s_array (kar upam da v PHP-ju naredi
nov array in vanj skopira vse elemente iz starega) in ponovno sortiral $array.

fiction ::

Aja pa se nekaj sem se spomnil kar bi benchmark lahko unicilo.
Ti meris cas med koncem in zacetkom. Ampak dejansko ne ves, da ni mogoce scheduler
od OS-a vmes preklopil na nek drug proces ter enkrat po zelo dolgem casu, drugic pa skoraj takoj preklopil
nazaj (recimo ker je tisti drug proces cakal na I/O).
Tako lahko dvakrat pozenes isti program, ki bi moral po pravilih vedno teci enako dolgo, ampak vseeno
dobis razliko. Najbolje bi bilo vzeti neko povprecje vecih izvajanj.

Zgodovina sprememb…

  • spremenil: fiction ()

MrBrdo ::

vi boste pa tut doktorirali iz tega.. ni nobene dileme..
MrBrdo

Zgodovina sprememb…

  • spremenilo: MrBrdo ()

fiction ::

MrBrdo: Na fri forumu si se ti tudi razpisal o Mahnicu in programiranju, tako da kar brez zadrzkov... ;)

Sverdejev benchmark me je malo spravil s teme in dejansko se ne gre vec o Javi temvec
o PHP-ju (kjer naj bi bila razlika med post in pre inkrementom baje ocitna).
Pa o tem, da je dobro malo pomisliti pri interpretaciji rezultatov raznih meritev in
ne samo slepo zaupati stevilkam.

Pac ++i ali i++ v for zanki je stvar navade in stila programiranja, se vedno pa mislim da ni nobene skode
ce se clovek navadi na ++i in vedno pise tako. Navsezadnje bi se lahko kregali tudi
o tem zakaj ljudje ne pisejo "i = i + 1", pa bo vsak takoj pribil "ker je i++ bolje / hitreje / etc" pa
to tudi ni neka taka velika optimizacija.

sverde21 ::

Poleg tega se mi zdi, da dvakrat klices isto funkcijo bubbleSort1()

Ja je bilo že pozno včeraj in sem spregledal, čeprav tudi ko pravilno kličem enkrat bubbleSort1 in drugič bubbleSort2 so rezultati precej podobni.

Ker je v $s_array kopija od prej, sem mislil da bos namesto $s_array = $array;
v 52 vrstici naredil $array = $s_array (kar upam da v PHP-ju naredi
nov array in vanj skopira vse elemente iz starega) in ponovno sortiral $array.

Po prvem sortiranju sem "uničil" spremenljivke, zato da vspostavim enake pogoje kot so na začetku pri prvem sortiranju.

Najbolje bi bilo vzeti neko povprecje vecih izvajanj.

Vem da moram gledati povprečje večih izvajanj, ker pri vsaki PHP skripti je tako, da se ko jo prvič izvedeš izvaja dalj časa, kot potem malce kasneje ko parkrat poženeš.

Drugače pa jaz se poskušam držati nekaj dejstev, ki jih je že nekaj časa nazaj napisal fatg. Citiram:
  1. Resnica št. 1: hardware je cenejši kot programer. Čas je denar. 1GB rama in dodaten procesor sta vredna manj kot 1 plača za programerja.
  2. Resnica št. 2: software optimizira boljše kot človek. Binarni sistem ne sovpada s človeškim načinom razmišljanja. Moderni programski jeziki obvladajo optimizacijo do mere, ki je daleč pred človeškimi sposobnostimi. Še posebej jeziki kot sta php in java.
  3. Resnica št. 3: pregledna in jasna koda je najboljša optimizacija. Kaj ti pomaga koda, ki se izvaja 0.01 sekunde hitreje, če je popolnoma nečitljiva? Kako tako kodo nadgrajuješ?
  4. Resnica št. 4: prezgodnja optimizacija je lahko usodna za projekt. Optimizacija je izguba človeškega časa (glej 1). Prezgodnja optimizacija pomeni optimiziranje delov sistema, ki se še niso izkazali za potrebne optimiziranja, ali še huje - ki jih mogoče ne bo nikoli potrebno optimizirati, ali celo sploh ne bodo nastopali v končnem produktu! Kaj pomaga optimizirana operacija na bazi, če se izvaja samo 1x na mesec?
<?php echo `w`; ?>

c00L3r ::

Kaj traja dlje?

izpiši(i);
i=i+1;

ali

i=i+1
ipziši(i);


Oboje traja isto, razlike se pojavljajo zaradi naključja. V for zanki, pa je popolnoma vseeno, če se uporabi i++ ali ++i.