Kezdőoldal » Számítástechnika » Programozás » C fordítóknál (általában) mi...

C fordítóknál (általában) mi eredményez gyorsabb gépi kódot : Ismétlődő értékre változó használata, vagy az ismétlődő érték többszöri beírása?

Figyelt kérdés

Hogy érthedőbb legyen a kérdésem, egy példával tudnám illusztrálni a kódot : Az alábbi két C kód közül, habár mindegyik ugyanazt az eredményt adja, fordításkor melyik lesz a gyorsabb (akár csak pár órajellel is)???:


1.) - első változat:

--------------------------

#include <math.h>

#include <stdio.h>


#define M 10000

#define G(n)sv[n>>6]&(1<<((n>>1)&31))

const int S=(int)sqrt((double)M);


int main(){

unsigned sv[(M>>6)+1]={0};

int i,j,k,l=0,p[M]={0};

p[0]=2;

for(i=3;i<=S;i+=2)if(!(G(i)))

{

k=(i<<1);

p[l++]=i;

for(j=i*i;j<=M;j+=k)sv[j>>6]|=(1<<((j>>1)&31));

}


for(;i<=M;i++)if(!(G(i)))p[l++]=i;

printf("%u\n\n",p[l-2]);

}

--------------------------



2.) - itt már spóroltam a változókkal, ahol (szerintem) lehetett:

--------------------------


#include <math.h>

#include <stdio.h>

#define M 10000

#define G(n)sv[n>>6]&(1<<((n>>1)&31))


int main(){

unsigned sv[(M>>6)+1]={0};

int i=3,j,l=0,p[M]={2};

for(;i<=sqrt(M);i+=2)if(!(G(i)))

for(j=(p[l++]=i)*i;j<=M;j+=i<<1)sv[j>>6]|=(1<<((j>>1)&31));


while(i<=M)if(!(G(++i)))p[l++]=i;

printf("%u\n\n",p[l-2]);

}

--------------------------


Annak, aki megnézi a kérdés szempontjából, előre is köszönöm! :)



2013. okt. 26. 01:14
 1/7 A kérdező kommentje:

Az egyik műveletsort hibásan jeleníti meg ez a hülye weboldal, megpróbálom mégegyszer kiírni csak azt a részt:


sv[j>>6]|=(1<<((j>>1)&31));

2013. okt. 26. 01:18
 2/7 anonim ***** válasza:
100%

Olyan ellentmondásos ez a kérdés...

Érted, hogy ez a bonyolultnak kinéző kód mit csinál, de forráskódmegosztó oldal helyett a kérdés leírásába másolod a programkódot. És megkérdezed, ahelyett, hogy lefordítanád a megfelelő kapcsolóval, hogy mutassa az assembly-t, vagy tesztelnéd.

(És a gyakorikérédseken teszed fel a kérdést, ahol általában érkezik egy ilyen szar válasz, mint ez.)

2013. okt. 26. 04:07
Hasznos számodra ez a válasz?
 3/7 iostream ***** válasza:

A kód átolvasása nélkül: a beírt konstans értékek elérése nem lesz gyorsabb a változók elérésénél, hiszen mindkettő a memóriában van, kivéve ha be tudja passzírozni egy mnemonic konstans operátoraként, de nem ez lesz a gyorsításod, mert ha konstans, akkor azt ő is látja, és fordítási időben simán behelyettesíti, akár egy makrót. A SZÁMOLT értékek újra és újra kiszámolása viszont szinte biztos, hogy lassabb, mint eltárolni és onnan elővenni. Az utóbbi egy memóriaművelet (feltehetőleg cachebe belefér), az előbbi meg függvényhívás (sqrt), ami költség, még ha a függvény futását nem is számoljuk.


És legfőképp amit a második mondott. Lefordítod, teszteled. Vagy ha mérési hibán belül van az eltérés, akkor 1) elfogadod, hogy ekvivalens a két megoldás 2) megnézed az assemblyt (-S vagy -E kapcsoló, nem emlékszem), és okoskodsz, hogy melyik a gyorsabb.

2013. okt. 26. 10:33
Hasznos számodra ez a válasz?
 4/7 A kérdező kommentje:

"egy példával tudnám illusztrálni a kódot"


FRANCBA, elírtam : nem kódot, DOLGOT!


Egyébként meg:


1.) nem ismerek jó forrásmegosztó oldalt, legalábbis eddig még nem láttam - csak tökre bugos izéket, amik még a színezést se tudták megcsinálni (pl. pastebin)

DE ha ismertek ilyet, szívesen venném, ha megosztanátok! :)


2.) nem ismerem, nem értek az asseblyhez (csak egy nagyon-nagyon picit, mondhatni éppenhogy tudok róla valamit), és szerintem nem is látnám át annyira, hogy az alapján el tudjam dönteni, max. csak méret szempontjából (úgy meg mindenki más is), de sebesség szempontjából egyáltalán nem


3.) A másodiknak köszönöm a választ : Tehát pl. az "int a=4,b=5,c=a+b;printf("%i",c);", az "int a=4,b=5;printf("%i",a+b);" és a "printf("%i",4+5);" sebesség szempontjából ekvivalensek egymással, ha jól értem. (?)

2013. okt. 26. 21:00
 5/7 iostream ***** válasza:
Ebből így szinte 100%, hogy pontosan ugyanazt a kódot generálja a fordító, ha minimálisan is optimalizál. A kérdés az, hogy hányszor használod az a+b értéket. Ha elég sokszor, akkor megérheti eltárolni. Ha nem összeadás, hanem gyökszámolás van, akkor már két használatnál is szinte biztos, hogy megéri.
2013. okt. 27. 21:26
Hasznos számodra ez a válasz?
 6/7 anonim ***** válasza:
Ne haragudj, ennél a pastebin is jobb lett volna.
2013. okt. 27. 21:28
Hasznos számodra ez a válasz?
 7/7 A kérdező kommentje:

"Ne haragudj, ennél a pastebin is jobb lett volna."


FRANCOKAT!!!

Ott még ennyire se tudtad volna elolvasni. :P

Irtó BUGOS az az oldal. És francokat se tud az!

2013. okt. 28. 06:20

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!