infoarena

infoarena - concursuri, probleme, evaluator, articole => Informatica => Subiect creat de: George Guraliuc din Aprilie 16, 2007, 17:09:48



Titlul: ++i vs i++
Scris de: George Guraliuc din Aprilie 16, 2007, 17:09:48
Am auzit ca e mai recomandat ++i decat i++, beneinteles, cand ambele optioni sunt disponibile. E mai rapid sau e doar o chestie de design?


Titlul: Răspuns: ++i vs i++
Scris de: Cezar Mocan din Aprilie 16, 2007, 17:11:26
E mai rapid.


Titlul: Răspuns: ++i vs i++
Scris de: Codrea Marcel din Aprilie 16, 2007, 17:43:26
S-a mai discutat despre asta aici : http://infoarena.ro/forum/index.php?topic=683.0

Mircea Pasoi zicea ca se indoieste ca s-ar simti diferenta ....nu stiu ce parere aveti voi, dar eu il cred ! 
Totusi e util pentru a-ti da colegii "pe spate" atunci cand implementezi la tabla !  :)


Titlul: Răspuns: ++i vs i++
Scris de: Florian Marcu din Aprilie 16, 2007, 18:41:30
Ai dreptate! Iar dak mai pun un "int main()" si un "return 0" deja incep sa creada k scriu tampenii =)) :evil:


Titlul: Răspuns: ++i vs i++
Scris de: Andrei Grigorean din Aprilie 16, 2007, 19:45:51
Chiar e mai rapid ++i. Mie mi s-a intamplat sa iau 90 cu i++, sa modific in ++i si sa iau 100.


Titlul: Răspuns: ++i vs i++
Scris de: Florian Marcu din Aprilie 16, 2007, 20:42:30
Interesanta faza... :-k.. De akum o sa incep sa lucrez si eu cu ++i..nu am nimik de pierdut...poate am kiar de castigat... Totusi cred k ai avut norok..de obicei testele nu sunt concepute pt a face programul sa pice din cauza a doi de "+" si a unui "i"...orikum..dak ai norok.. :wink:


Titlul: Răspuns: ++i vs i++
Scris de: Andrei Grigorean din Aprilie 16, 2007, 21:13:21
Era chiar la limita sursa si cum aveam un for destul de mare (nu mai stiu exact... oricum era ceva gen 100.000) s-a simtit diferenta.


Titlul: Răspuns: ++i vs i++
Scris de: Codrea Marcel din Aprilie 16, 2007, 22:33:24
Am facut o mica sursa pentru a analiza timpii de executie:

Cod:
#include<stdio.h>
#include<time.h>
long long i,j,t1,t2,k;
int main()
{
 freopen("","r",stdin);
 freopen("","w",stdout);
 for(k=1;k<=10;k++)
 {
 t1=clock();
 scanf("%lld",&j);
 for(i=1;i<=j;i++);//sau ++i
  t2=clock();
 printf("%.6f\n",(t2-t1)/18.2);
 }
 return 0;
}

Pentru fisierul de intrare care contine numerele :

Cod:
1000000000
1500000000
2000000000
20000
50000000
200000000
2500000000
450000000
500000000
900000000

Timpii de executie pentru ++i

Cod:
46.153846
69.230769
92.032967
0.000000
2.197802
9.340659
115.109890
20.879121
23.076923
41.483516

Timpii de executie pentru i++

Cod:
48.626374
72.802198
96.978022
0.000000
2.197802
9.890110
121.703297
21.978022
24.175824
43.956044



Titlul: Răspuns: ++i vs i++
Scris de: George Guraliuc din Aprilie 17, 2007, 16:10:06
Deci ++i e putin mai rapid. Inseamna ca se merita sa folosesti ++i.


Titlul: Răspuns: ++i vs i++
Scris de: Florian Marcu din Aprilie 17, 2007, 16:21:04
Asa e! pe situatii de acestea ff mari se simte diferenta din plin.. :thumbup: dupa kum am putut observa... :-'


Titlul: Răspuns: ++i vs i++
Scris de: Mircea Pasoi din Aprilie 17, 2007, 16:22:33
Din cate vad eu, prima diferenta se face pe la 200.000.000 de iteratii , desi este o diferenta foarte mica (cam de 5%). Chiar nu cred ca se poate spune ca se merita sa folosesti ++i in ideea de a obtine timpi de rulare mai mici , mai ales la problemele de algoritmica.

Later edit:
Asa e! pe situatii de acestea ff mari se simte diferenta din plin.. :thumbup: dupa kum am putut observa... :-'

Din plin? Diferenta este cam de 5%. Nu prea am vazut probleme cu limita de timp peste cateva secunde.. iar pana in 20 de secunde diferenta este aproape insesizabila.


Titlul: Răspuns: ++i vs i++
Scris de: Silviu-Ionut Ganceanu din Aprilie 17, 2007, 20:10:32
Intr-adevar e mai rapid "++i". E drept, diferenta este insesizabila daca i este int.

Recomandarea mea: obisnuiti-va sa scrieti "++i" pentru ca diferentele pot fi majore daca i nu este de tip intreg. De exemplu, in cazul iteratorilor diferenta incepe sa fie sesizabila. Asta sa nu mai discutam daca va definiti voi un obiect mare pe care supraincarcati operatorii astia si copierea e costisitoare (de exemplu, clasa de numere mari).

Silviu


Titlul: Răspuns: ++i vs i++
Scris de: Cristian Strat din Aprilie 18, 2007, 13:41:23
Vis-a-vis de exemplul cu int-uri de mai sus, daca mai si faci ceva in bucla aia, timpul castigat per numar de iteratii e mult mai mic.


Titlul: Răspuns: ++i vs i++
Scris de: Valentin Stanciu din Aprilie 19, 2007, 17:14:04
Repet ce a zis si Silviu, daca i nu este int, ci alt tip de date, diferenta poate fi majora. De exemplu pentru "rope" din STL se recomanda sa folosesti de cate ori este posibil pre-incrementation fata de post-incrementation.
Citat din mesajul lui: STL rope documentation
Iterators are on the order of a dozen words in size. This means that copying them, though not tremendously expensive, is not a trivial operation. Avoid postincrementing iterators; use preincrement whenever possible.