7 functii cu fotbalisti

Intrebari despre limbajul C++, standardul C++, STL, OOP in C++ sau alte subiecte nelegate de VisualC++
User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: 7 functii cu fotbalisti

Post by Ovidiu Cucu » 25 Sep 2009, 21:50

Intr-un sistem, sa zicem unul embedded si/sau realtime in care conteaza atat viteza cat si marimea programului, ar fi de luat in considerare f4 si f6.
Desi aici f6 a iesit doar pe locul 3, pe unele procesoare s-ar putea sa mearga chiar mai repede pentru ca nu implica nici un jump.
Depinde... de la caz la caz.

Oricum, sintagma "noi muncim, compilatorul gandeste", eu unul n-as recomanda-o nici macar in aplicatii care (aparent) nu sunt time/size critical.
Compilatorul "Mama Omida"... e doar o legenda. ;)



User avatar
Marius Bancila
Fondator
Fondator
Posts: 2344
Joined: 11 Jul 2007, 11:45
Judet: Timiş
Location: Timisoara
Contact:

Re: 7 functii cu fotbalisti

Post by Marius Bancila » 26 Sep 2009, 12:35

Cu tot respectul nu cred ca esti in stare sa faci optimizari mai bune decat compilatorul. ;) Eu unul sigur nu sunt. Hai sa zicem ca faci aici sau acolo, dar intr-un program mare nu poti sa stai sa te gandesti la fiecare lucru daca e cel mai optim sau mai stiu eu ce.
Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: 7 functii cu fotbalisti

Post by Ovidiu Cucu » 26 Sep 2009, 13:49

Marius Bancila wrote:Cu tot respectul nu cred ca esti in stare sa faci optimizari mai bune decat compilatorul. ;) Eu unul sigur nu sunt. Hai sa zicem ca faci aici sau acolo, dar intr-un program mare nu poti sa stai sa te gandesti la fiecare lucru daca e cel mai optim sau mai stiu eu ce.
Stiu si eu
The Cardinal Rules of Optimization:
1. Do not optimize
2. For experts only: do not optimize yet
Daca prima e clara cea de a doua e mai subtila (de aia e "for experts only" :)) si a fost interpretata in fel si chip.

Trecand deocamdata peste asta
Intradevar nu are rost sa te iei (prosteste) la intrecere cu complatorul in optimizari.
Poti totusi scrie din prima cod in asa fel incat sa-l ajuti sa gaseasca "optimizarea optima" ;).

User avatar
MrSmersh
Microsoft MVP
Microsoft MVP
Posts: 289
Joined: 20 Jul 2007, 10:18
Location: Timisoara
Contact:

Re: 7 functii cu fotbalisti

Post by MrSmersh » 26 Sep 2009, 21:53

Sincer inca nu m-am apucat sa ma uit pe cod dar e in LAP :biggrin: ...
Dar o curiozitate ma maninca pina atunci, efectul optiunilor de compilare (ce de optimizari), careva a incercat cum ar afecta rezultatele?

User avatar
zlatomir
Membru++
Membru++
Posts: 282
Joined: 04 Jul 2009, 23:59
Location: Arad
Contact:

Re: 7 functii cu fotbalisti

Post by zlatomir » 28 Sep 2009, 16:45

Am modificat f2 care era cea mai "puturoasa" si am folosit un vector de char*, rezultatul il aveti...
test.JPG
test.JPG (18.48 KiB) Viewed 6913 times

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: 7 functii cu fotbalisti

Post by Ovidiu Cucu » 28 Sep 2009, 20:30

zlatomir wrote:Am modificat f2 [...]
Cum arata varianta modificata? Poate o facem f8.

User avatar
zlatomir
Membru++
Membru++
Posts: 282
Joined: 04 Jul 2009, 23:59
Location: Arad
Contact:

Re: 7 functii cu fotbalisti

Post by zlatomir » 28 Sep 2009, 21:28

Nu cred ca e necesar, doar eram eu curios daca merge mai repede ca si un array (cred ca mi se trage de la capitolele despre array, din fiecare carte de c++ pe care am citit-o, la care dupa exagerat de multe pagini iti zice sa nu folosesti char array mai bine char* si apoi poate zice de string si pentru celelalte tipuri folositi vector).
Deci sa revin, functia e banala, doar curiozitatea mea era mare si am pus rezultatul pentru ceilalti curiosi:

Code: Select all

// bineinteles cu vectorul vec declarat si initializat
const char* fx (unsigned int id) { if id < vec.size() return vec[id]; else return ("N/A"); } 
Intrebare: se poate initializa un vector? ceva de genul char* array [] = { "Unu", "Doi",...} // asta stiu ca nu merge numai la array, dar are std::vector ceva asemanator, in 0<he>x stiu ca o sa aibe, dar acum?
Last edited by zlatomir on 29 Sep 2009, 14:44, edited 1 time in total.

User avatar
maximghe
Membru
Membru
Posts: 139
Joined: 10 Aug 2007, 23:54

Re: 7 functii cu fotbalisti

Post by maximghe » 29 Sep 2009, 01:23

zlatomir wrote: Intrebare: se poate initializa un vector? ceva de genul char* array [] = { "Unu", "Doi",...} // asta stiu ca nu merge numai la array, dar are std::vector ceva asemanator, in 0<he>x stiu ca o sa aibe, dar acum?
NU.

Pentru a scuti ceva cod pentru initializare s-ar putea scrie semi-magarii de genul

Code: Select all

   const char* array[N] = {"Ala", "bala", "portocala", /* s.a.m.d. */};

   std::vector<char*> v(N);
   memcpy(&v[0], array, N * sizeof(char*));
Dar nu-i chiar aceeasi mincare de peshte. :)
Max

Viorel
Microsoft MVP
Microsoft MVP
Posts: 293
Joined: 13 Jul 2007, 12:26

Re: 7 functii cu fotbalisti

Post by Viorel » 29 Sep 2009, 08:49

Poate fi iniţializat şi aşa:

Code: Select all

const char* array[N] = {"Ala", "bala", "portocala" /* s.a.m.d. */};
std::vector<const char*> v(array, array + N);
Revenind la problema optimizării, una din încercări (probabil din cele nerecomandate) ar fi adăugarea cuvîntului-cheie __fastcall, de ex.:

Code: Select all

const char * __fastcall f7(unsigned int id);
Acum funcţia f7 constă din două instrucţiuni în loc de trei, dar modul de apel este altul.

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

7 + 1 functii cu fotbalisti

Post by Ovidiu Cucu » 04 Oct 2009, 14:10

zlatomir wrote:Am modificat f2 care era cea mai "puturoasa" si am folosit un vector de char* [...]
Pai varianta asta nu seamana deloc cu f2. Mai degraba e o mica variatie (mai binezis o mica compicatie ;)) pe tema lui f4.
Am pus-o in f8:

Code: Select all

const std::vector<const char*> v(g_names, g_names + N);
const char* f8(unsigned int id)
{
   const char* name = NULL;

   if(id < N)
      name = v[id];
   else
      name = v[0];

   return name;
}
Cum era de asteptat, rezultatul e cam acelasi la f8 si f4, f8 fiind o tzira mai puturos.
Test f1-f8.gif
Test f1-f8.gif (7.16 KiB) Viewed 6818 times
GetNameTest.zip
(21.23 KiB) Downloaded 216 times

User avatar
maximghe
Membru
Membru
Posts: 139
Joined: 10 Aug 2007, 23:54

Re: 7 functii cu fotbalisti

Post by maximghe » 04 Oct 2009, 18:37

Am facut un test cu profilerul din Visual Studio si mi-a dat urmatoarele rezultate

Code: Select all

        Func          Func+Child           Hit
        Time   %         Time      %      Count  Function
---------------------------------------------------------
      67.624   1.4       67.624   1.4  2500000 f2(unsigned int) (f2.obj)
      66.353   1.4       66.353   1.4  2500000 f3(unsigned int) (f3.obj)
      57.235   1.2       57.235   1.2  2500000 f5(unsigned int) (f5.obj)
      56.198   1.2       56.198   1.2  2500000 f1(unsigned int) (f1.obj)
      40.676   0.8       40.676   0.8  2500000 f8(unsigned int) (f8.obj)
      39.322   0.8       39.322   0.8  2500000 f6(unsigned int) (f6.obj)
      38.942   0.8       38.942   0.8  2500000 f4(unsigned int) (f4.obj)
      37.469   0.8       37.469   0.8  2500000 f7(unsigned int) (f7.obj)
Clar. Metoda if-else-cîrnaţ :) e pe primul loc la leneveala.
Max

Cryogenic
Membru
Membru
Posts: 55
Joined: 30 Jun 2008, 17:43

Re: 7 functii cu fotbalisti

Post by Cryogenic » 08 Oct 2009, 14:49

maximghe wrote: Clar. Metoda if-else-cîrnaţ :) e pe primul loc la leneveala.
In cazul de fata da, dar ce se intampla pentru extreme? de exemplu cand valorile de input nu mai sunt random ci se folosesc edge case-uri, de ex. functiile sunt chemate primul index sau doar cu ultimul? sau e un bias evident spre una din valori?

Eu zic ca concluzia fn e mai rapida nu e o concluzie care se poate aplica tot timpul, ... e doar o concluzie generala (majoritarea timpului fn va fi mai rapid), optimizarile adevarate se fac in context. De exemplu exista cazuri speciale cand bouble sort e mai rapid ca si quick sort, sau cand heap sort e mai rapid, etc in functie de ordonarea datelor de input.

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: 7 functii cu fotbalisti

Post by Ovidiu Cucu » 11 Oct 2009, 08:22

Cryogenic wrote:
maximghe wrote: Clar. Metoda if-else-cîrnaţ :) e pe primul loc la leneveala.
In cazul de fata da, dar ce se intampla pentru extreme? de exemplu cand valorile de input nu mai sunt random ci se folosesc edge case-uri, de ex. functiile sunt chemate primul index sau doar cu ultimul? sau e un bias evident spre una din valori?

Eu zic ca concluzia fn e mai rapida nu e o concluzie care se poate aplica tot timpul, ... e doar o concluzie generala (majoritarea timpului fn va fi mai rapid), optimizarile adevarate se fac in context. De exemplu exista cazuri speciale cand bouble sort e mai rapid ca si quick sort, sau cand heap sort e mai rapid, etc in functie de ordonarea datelor de input.
Oricat ai trage de cazurile particulare, metoda if-else-cîrnaţ nu va fi mai rapida decat celelalte, cel putin in C/C++.
Nu doare pe nimeni nici mana, nici mintea sa aleaga din start o varianta susceptibil de a fi in general mai buna.

Cei drept e drept... unii s-au imbogatit vanzand tricouri de genul:
I write code.jpg
I write code.jpg (26.29 KiB) Viewed 6717 times
:)

User avatar
Andreas
Membru
Membru
Posts: 117
Joined: 09 Nov 2008, 12:13
Judet: Timiş
Location: Timisoara

Re: 7 functii cu fotbalisti

Post by Andreas » 11 Oct 2009, 23:39

Cu tot respectul: comparatiile din acest thread sunt gresite, in sensul ca ne-am propus sa stabilim un clasament ar unor functii care ori fac parte din categorii diferite ori nu au sens ca si constructie. Nu are sens sa comparam viteza unor functii care implementeaza blocuri decizionale cu functii, si aici nu vad sensul, care ca si construct semana cu scarpinarea cu mana la urechea opusa, adica toate functiile care seamana cu f8. Deci de ce as construi o functie ca si f8 care "rastalmaceste" mecanismul built-in al unui compilator, de indexare al unui vector, si mai ales de ce l-as compara cu un bloc decizional, acele functii "puturoase" cu if(a==b)... care deschid posibilitati de dezvolatare a executiei programului, adica implementarea unor efecte laterale.
Sunt de parere ca este fireasca doar comparatia intre switch..case.. si if...ele...

User avatar
zlatomir
Membru++
Membru++
Posts: 282
Joined: 04 Jul 2009, 23:59
Location: Arad
Contact:

Re: 7 functii cu fotbalisti

Post by zlatomir » 12 Oct 2009, 00:03

Nu cred ca functiile fac parte din categorii foarte diferite, in fond sunt doua categorii si respectiv doua versus-uri in toate functiile (if ... else vs switch si array vs std::vector) , am adaugat vector-ul mai mult din curiozitate, pentru a vedea cum se manifesta in comparatie cu array-ul, si se descurca destul de bine, avand in vedere faptul ca are unele avantaje fata de array si doar dezavantajul cu initializarea (care va fi rezolvat in c++ 0<he>x :biggrin: )
f8 care "rastalmaceste" mecanismul built-in al unui compilator, de indexare al unui vector
nu mi se pare sa faca "atat de mult rau" aceasta functie, in fond array-ul nu avea concurent...
Poti detalia putin cum anume aceasta functie rastalmaceste mecanismul build-in al unui compilator, chiar nu inteleg (sunt destul de incepator).

Post Reply