Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Fanaticna optimizacija

[es] :: C/C++ programiranje :: Fanaticna optimizacija

[ Pregleda: 2080 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

NrmMyth
Ivan Maček
Split

Član broj: 63456
Poruke: 849
*.cmu.carnet.hr.

Sajt: www.dump.hr


Profil

icon Fanaticna optimizacija14.08.2005. u 17:15 - pre 227 meseci
Pozdrav.
Evo pitanja za najjace optimizatore i iskusne programere.

Radi se o funkciji za prebrojavanje ukljucenih bitova u nekoj varijabli.
Pogledajte oba primjera pa recite koji je brzi.

Code:
template<class T>
unsigned count(T var)  {
     unsigned rezultat(0); // broj ukljucenih bitova
     unsigned br_bitova(sizeof(T)*8); // broj ukupnih bitova u varijabli
// pogledajte ovaj dio 
     for(int i(0); i<br_bitova; ++i)  {
            rezultat+=static_cast<unsigned>( static_cast<bool>(var & maska[i]) );
     return rezultat;
}

//// i druga funkcija

template<class T>
unsigned count(T var)  {
     unsigned rezultat(0); // broj ukljucenih bitova
     unsigned br_bitova(sizeof(T)*8); // broj ukupnih bitova u varijabli
// pogledajte ovaj dio 
     for(int i(0); i<br_bitova; ++i)  {
            if( (var & maska[i]) != 0)
                  ++rezultat;
     return rezultat;
}

NB: maska[] je niz integera sa postavljenim samo jednim bitom, { 1,2,8,16,32,64, ... }


Razlika je u tome sta u prvoj funkciji on pretvara broj u 0 ili 1, pa ga sprema kao integer i zbraja na sumu,
a u drugoj on provjerava jeli razlicito od nule i tek onda ako je incrementira.

Znam da je ovo fanaticna situacija, ali brzina mi je bitna, jer se u mom slucaju ne radi o jednoj varijabli.

Pitanje je jeli brzi if() od 2 static_casta<>() i bespotrebnog dodavanja 0.
 
Odgovor na temu

NastyBoy
Bojan Nastic
UK

Član broj: 12041
Poruke: 895
*.plus.com.



+4 Profil

icon Re: Fanaticna optimizacija14.08.2005. u 17:27 - pre 227 meseci
Ako vec jurish optimizaciju, pogledaj sledeci nachin pre nego se upustish u optimizaciju nechega shto nije optimalno u startu (mislim na duzhinu petlje).

Code:

int bit_count(long x)
{
        int n = 0;

        if (x)
            do {
               n++;
            } while ((x &= x-1));

        return(n);
}


Pogledaj slichne primere na : http://paul.rutgers.edu/~rhoads/Code/code.html
 
Odgovor na temu

caboom
Igor Bogicevic
bgd

Član broj: 255
Poruke: 1503
*.pat-pool.bgd.sbb.co.yu.

ICQ: 60630914


+1 Profil

icon Re: Fanaticna optimizacija14.08.2005. u 21:58 - pre 227 meseci
http://www-db.stanford.edu/~manku/bitcount/bitcount.html

NrmMyth, gornja dva primera koje si naveo su sve samo ne efikasni...
 
Odgovor na temu

NrmMyth
Ivan Maček
Split

Član broj: 63456
Poruke: 849
*.cmu.carnet.hr.

Sajt: www.dump.hr


Profil

icon Re: Fanaticna optimizacija15.08.2005. u 10:33 - pre 227 meseci
Zahvaljujem na teoriji.
 
Odgovor na temu

[es] :: C/C++ programiranje :: Fanaticna optimizacija

[ Pregleda: 2080 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.