Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: optimointi, kannattaako ennakkolaskenta

tkok [15.12.2008 02:05:41]

#

onko nopeuseroa?

Tällä

//ennen mainia:
int y = 9;

//funktiossa
funktio(int x){
	for(int i=0; i<x-y; i++){
		std::cout << i << "\n";
	}
}

tai tällä:

//ennen mainia:
int y = 9;

//funktiossa
funktio(int x){
	int erotus = x-y;
	for(int i=0; i<erotus; i++){
		std::cout << i << "\n";
	}
}

Metabolix [15.12.2008 02:17:49]

#

Teoriassa eroa on, jos et käytä optimointilippuja. Tällöinkin kannattaa muistaa, että vähennyslasku on äärimmäisen nopea operaatio verrattuna tulostuksesta aiheutuviin funktiokutsuihin ja luvun muuttamiseen tekstiksi puhumattakaan todellisista tapahtumista kuten tekstin piirtämisestä ruudulle tai tallentamisesta kovalevylle. Käytännössä eroa tuossa tapauksessa on jokunen miljoonasosa.

Oikeassa elämässä sitten käytetään optimointilippuja, joista jo yksinkertaisin (gcc -O) poistaa melkoisen joukon tyhmyyksiä ja optimoi esimerkiksi tuon järkevästi. On tietenkin mahdollista, että silmukassa on sellaisia asioita, jotka voivat muuttaa tuossa y:n arvoa (tai joista ei tiedetä, tekevätkö ne sen), jolloin optimointia ei voi tehdä.

Tuon tyyppiset omat "optimoinnit" yleensä aiheuttavat enemmän harmia kuin hyötyä, ja usein liika yrittäminen jopa hidastaa koodia. Kannattaa panostaa järkevään toteutukseen suuremmissa linjoissa ja hyvään ohjelmointitapaan ja jättää virittely kääntäjän huoleksi.

FooBat [15.12.2008 03:42:42]

#

Oikea vastaus on: kokeile ja mittaa. Olettaen, että y ei oikeasti ole vakio, vaan jonkinasteinen globaali muuttuja, jota muutetaan useammasta paikasta tai jopa useammasta säikeestä, niin ennakkolaskenta voi olla nopeampaa, koska kääntäjä ei välttämättä voi/osaa/saa olettaa, että y pysyisi vakiona jokaisella silmukan suorituskerralla. Jos ennakkolaskentaan liittyy funktiokutsuja niin ennakkolaskenta on lähes poikkeuksetta nopeampaa. Mutta kuten Metabolix sanoi, kannattaa optimoida vain asioita, jotka vaativat optimointia eikä turhaan sekoittaa kaikkea koodia sekavilla optimoinneilla. Toisaalta tietyissä tapauksissa sijoittamalla hankala ennakkolaskenta kuvaavan nimiseen muuttujaan voidaan jopa parantaa koodin luettavuutta.

Createman [18.12.2008 11:46:03]

#

Itse käytän mielelläni "ylimääräisiä" kuvaavan nimisiä muuttujia juurikin koodin luettavuuden parantamiseen.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta