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:

7 functii cu fotbalisti

Post by Ovidiu Cucu » 13 Sep 2009, 17:55

[ quiz dar si subiect de discutie ]

Sa zicem ca avem de implemetat o functie care primeste un intreg (sa zicem numarul de pe tricou) si care intoarce numele unui fotbalist din echipa nationala.
Se pune probema de implementare optima (viteza in primul rand, dar nu numai).
Pe care ati alege-o dintre variantele de mai jos?

Code: Select all

const char* f1(unsigned int id)
{
   const char* name = NULL;

   switch(id)
   {
   case 1:
      name = "Adi Mutu";
      break;
   case 2:
      name = "Marius Niculae";
      break;
   // ...alte nume. // 3..N
   default:
      name = "necunoscut";
   }

   return name;
}

Code: Select all

const char* f2(unsigned int id)
{
   const char* name = NULL;

   if(id == 1)
      name = "Adi Mutu";
   else if(id == 2)
      name = "Marius Niculae";
   // ...alte nume. // 3..N
   else
      name = "necunoscut";
  
   return name;
}

Code: Select all

const char* f3(unsigned int id)
{
   return (id == 1) ? "Adi Mutu" :
          (id == 2) ? "Marius Niculae" :
          // ...alte nume. // 3..N
          "necunoscut";
}

Code: Select all

static const unsigned int N = 20;
static const char* g_names[N] = 
{
   "necunoscut",
   "Adi Mutu",
   "Marius Niculae",
   // ...alte nume. // 3..N
};

const char* f4(unsigned int id)
{
   const char* name = NULL;

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

   return name;
}

Code: Select all

const char* f5(unsigned int id)
{
   const char* name = NULL;
   const unsigned int N = 20;
   const char* names[N] = 
   {
      "necunoscut",     // 0
      "Adi Mutu",       // 1
      "Marius Niculae", // 2
      // ...alte nume.  // 3..N
   };

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

   return name;
}

Code: Select all

static const unsigned int N = 20;
static const char* g_names[N] = 
{
   "necunoscut",     // 0
   "Adi Mutu",       // 1
   "Marius Niculae", // 2
   // ...alte nume.  // 3..N
};

const char* f6(unsigned int id)
{
   return g_names[(id < N) * id];
}

Code: Select all

static const char* g_names[256] = 
{
   "necunoscut",     // 0
   "Adi Mutu",       // 1
   "Marius Niculae", // 2
   // ...alte nume.  // 3..N
   "necunoscut"      // N+1..255
};


const char* f7(unsigned char id)
{
   return g_names[id];
}
// Daca in exemplele de mai sus nu corespund numerele de pe tricou cu cele reale, rog nu raportati ca bug! :D



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

Re: 7 functii - aceeasi fotbalisti [quiz]

Post by zlatomir » 13 Sep 2009, 18:35

Sanse maxime sa ma insel (data fiind lipsa de experienta) dar eu cred ca f1 ar fi mai rapida, cred ca acel "switch" se executa mai rapid decat "if" sau citire din array de char*...

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 » 13 Sep 2009, 18:53

In principiu, da. Un switch ar trebui sa fie mai rapid decat if, else if,.. else.
Totusi, de ce ar trebui sa fie mai rapid si decat indexarea intr-un array?

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

Re: 7 functii cu fotbalisti

Post by Viorel » 13 Sep 2009, 20:59

Deoarece calculatorul execută nu sursele, ci secvenţe de instrucţiuni rezultate în urma compilării, anume acestea urmează a fi comparate. Performanţa poate fi comparată şi experimental. Clasamentul ar putea depinde de tipul de microprocesor.

Cred că metoda bazată pe indexare este de obicei mai rapidă.

Cu optimizările activate, aceste instrucţiuni switch pot fi compilate sub forma unor salturi indirecte indexate.

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 » 13 Sep 2009, 21:47

Absolut deacord. Depinde de procesor, de compilator si de optiunile de compilare.
Personal, as alege in cele mai multe cazuri varianta f1 (cu switch).

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 » 13 Sep 2009, 22:17

OT
Ovidiu Cucu wrote:In principiu, da. Un switch ar trebui sa fie mai rapid decat if, else if,.. else.
Totusi, de ce ar trebui sa fie mai rapid si decat indexarea intr-un array?
No bine prin cartile de 1x mai ales zic invers, si cred ca ar fi interesant sa sapam subiectul... Sa arunc mingea cred ca visualu in general se prinde si rar va fi o diferenta... Si de aia nu am prea vezut difrentele de care ziceau....

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

Re: 7 functii cu fotbalisti

Post by Cryogenic » 14 Sep 2009, 00:26

Intrebarea e destul de teoretica, pentru set-uri de date foarte mici cache-ul procesorului va face astfel incat sa nu existe diferente masurabile intre majoritarea solutiilor, insa pentru set-uri de date mari ( n > k, k fiind un threshold dependent de arhitectura de CPU, cache etc.) varianta bazata pe indexare ar trebuii sa castige ca performanta (cu conditia sa nu fie prea smecher compilatorul si sa stransforme un switch imens in acess indexat).

O regula de performata care mie-mi place zice "smaller is faster", cu cat e mai mic codul in general cu atat va rula mai repede, bineinteles cu exceptiile de rigoare, adica cele 2 bucati de cod sa aiba comportament asemanator la nivel de "cache miss/cache hit".

Un micro benchmark ar putea sa dea o idee general despre performanta (desi exemplele sunt triviale), dar pana la urma algorimul cel mai rapid dintre toate nu poate fi ales decat in context-ul aplicatiei care-l foloseste, prin profiligul aplicatiei finale.

Si in plus functiile sunt extrem de triviale, nici macar nu ar trebuii sa se puna problema performantei (pe care orice compilator modern o poate optimiza), ci mai degraba a corectitudinii si a claritatii codului.

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 » 14 Sep 2009, 13:53

MrSmersh wrote:Sa arunc mingea cred ca visualu in general se prinde si rar va fi o diferenta...
Nu cred ca aparut inca pe piata compilatorul "Mama Omida". :D
Cryogenic wrote:Un micro benchmark ar putea sa dea o idee general despre performanta (desi exemplele sunt triviale), dar pana la urma algorimul cel mai rapid dintre toate nu poate fi ales decat in context-ul aplicatiei care-l foloseste, prin profiligul aplicatiei finale.

Si in plus functiile sunt extrem de triviale, nici macar nu ar trebuii sa se puna problema performantei (pe care orice compilator modern o poate optimiza), ci mai degraba a corectitudinii si a claritatii codului.
Sa presupunem ca "in contextul aplicatiei" aceasta functie este apelata in mod intensiv deci conteaza implementarea pe care o aleg. Nici una din variante nu este "inventata" cap-coada. Le-am intalnit pe toate in aplicatii reale (unele acolo unde fiecare milisecunda si/sau byte conteaza). Le-am rescris doar intr-o forma "artistica". :D
Bineinteles, am facut niste benchmark-uri inainte de a scrie in OP cuvantul "quiz".
Last edited by Ovidiu Cucu on 14 Sep 2009, 22:40, edited 2 times in total.
Reason: Mama Omida in loc de Mama Capşuna

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 » 15 Sep 2009, 10:25

Ovidiu Cucu wrote:
MrSmersh wrote:Sa arunc mingea cred ca visualu in general se prinde si rar va fi o diferenta...
Nu cred ca aparut inca pe piata compilatorul "Mama Omida". :D

....
Ai sa fi surprins, si in definitiv ce are cu omidele :biggrin: ? Un switch si un else if pina la urma cam in aceeasi cod obiect ar trebui sa ajunga, din punct de vedere functionalitate cam aceeasi chestie fac, si exista amindoaua ca e mai frumos pentru noi. Si lectia asta am invtat-o la practic incercam sa optimizez codul pentru dupa cum zice carte, si un coleg imi zice ca nu se pune si din contradctia asta luma odul generat la studiat... Si chiar nu se prea punea, in general era cam la fel.

User avatar
cristianamarie
Membru++
Membru++
Posts: 480
Joined: 12 Mar 2009, 18:47
Judet: Iaşi
Location: Iasi

Re: 7 functii cu fotbalisti

Post by cristianamarie » 15 Sep 2009, 14:44

Ma bag si eu la spartul tirgului, dar daca trebuie sa imi fac probleme gen if..else vs switch, mai bine schimb compilatorul.
Nuclear launch detected

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 » 15 Sep 2009, 20:14

cristianamarie wrote:Ma bag si eu la spartul tirgului, dar daca trebuie sa imi fac probleme gen if..else vs switch, mai bine schimb compilatorul.
Dar daca unii nu pot si nu pot si nu pot schimba compilatorul...? ;)

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

Re: 7 functii cu fotbalisti

Post by Cryogenic » 16 Sep 2009, 16:17

Ovidiu Cucu wrote:
cristianamarie wrote:Ma bag si eu la spartul tirgului, dar daca trebuie sa imi fac probleme gen if..else vs switch, mai bine schimb compilatorul.
Dar daca unii nu pot si nu pot si nu pot schimba compilatorul...? ;)
Si asta e un quiz din ala fara raspuns? doar asa ca motiv de discutie?

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 » 18 Sep 2009, 14:01

Eu as zice sa faci benchmark la toate variantele, si vezi care se executa cel mai rapid.
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 » 25 Sep 2009, 15:58

OK, un mic test.
if_else_if_else_is_the_worst.gif
if_else_if_else_is_the_worst.gif (6.94 KiB) Viewed 8052 times
Se observa ca versiunea if-else if-else este cea mai puturoasa alaturi de sora ei cu ?: (f2, respectiv f3).

Atasez si programelul pentru cine vrea sa se joace putin ;)
GetNameTest.zip
(20.59 KiB) Downloaded 306 times

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 » 25 Sep 2009, 19:34

Nu e de mirare ca f7 e cea mai rapida. Nu e decat un access la un element dintr-un array.
Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog

Post Reply