/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
Bech_bb 500
kyllekylle 500
jdjespers.. 500
gibson 300
scootergr.. 300
molokyle 287
10  strarup 270
Template funktion vs. non template. Templa~
Fra : Janus


Dato : 08-05-07 22:00

Jeg ville teste en banal funktion i to udgaver. Begge kører et loop af en
vis længde. Den ene får antal itterationer som template argument, og den
anden får det som parameter.
Jeg forventede templateudgaven ville være hurtigst, men det er den ikke.

Et loop som for(int i=0;i<konstant;i++) burde jo være hurtigere end for(int
i=0;i<variabel;i++), men det er ikke tilfældet.
Måske nogle kan give en forklaring?

Den kaldende funktion indeholder:
DWORD durationA, durationB;

int out=0;

DWORD start=GetTickCount();

for(int i=0;i<10000;i++)

out=testB(1,100000);

durationA=GetTickCount()-start;

out=0;

start=GetTickCount();

for(int i=0;i<10000;i++)

out=testA<100000>(1);

durationB=GetTickCount()-start;



Funktionerne er defineret som:

template <int iter>

int testA(int value)

{

int result=0;

for(int i=0;i<iter;i++)

result+=value;

return result;

}





int testB(int value, int iter)

{

int result=0;

for(int i=0;i<iter;i++)

result+=value;

return result;

}



 
 
Thorsten Ottosen (09-05-2007)
Kommentar
Fra : Thorsten Ottosen


Dato : 09-05-07 09:32

Janus skrev:
> Jeg ville teste en banal funktion i to udgaver. Begge k�rer et loop af en
> vis l�ngde. Den ene f�r antal itterationer som template argument, og den
> anden f�r det som parameter.
> Jeg forventede templateudgaven ville v�re hurtigst, men det er den ikke.
>
> Et loop som for(int i=0;i<konstant;i++) burde jo v�re hurtigere end for(int
> i=0;i<variabel;i++), men det er ikke tilf�

Når først værdien af variablen er placeret i et register, så er
forskellen forsvundet.

mvh

-Thorsten

Janus (09-05-2007)
Kommentar
Fra : Janus


Dato : 09-05-07 13:01

> Når først værdien af variablen er placeret i et register, så er forskellen
> forsvundet.

Jah, det er jo korrekt. Måske. Husker ikke helt timingen længere, men
sammenlign reg,reg er jo en anden opcode end sammenlign reg,konstant. Måske
de er lige hurtige.
Det du siger er vel egentlig også at hvis der er en masse operationer inde i
løkken, så vil tæller-registret ikke kunne holdes frit, og man kan forvente
at hastigheden går ned, da man så hver hvert loop skal genloade tælleren fra
ram til register?



Kent Friis (09-05-2007)
Kommentar
Fra : Kent Friis


Dato : 09-05-07 16:02

Den Wed, 9 May 2007 14:00:39 +0200 skrev Janus:
>> Når først værdien af variablen er placeret i et register, så er forskellen
>> forsvundet.
>
> Jah, det er jo korrekt. Måske. Husker ikke helt timingen længere, men
> sammenlign reg,reg er jo en anden opcode end sammenlign reg,konstant. Måske
> de er lige hurtige.

reg,reg er hurtigere, reg,konstant skal læse en ekstra gang fra RAM. Så
selv i konstant-tilfældet vil compileren smide konstanten i et register
(hvis det kan betale sig).

> Det du siger er vel egentlig også at hvis der er en masse operationer inde i
> løkken, så vil tæller-registret ikke kunne holdes frit, og man kan forvente
> at hastigheden går ned, da man så hver hvert loop skal genloade tælleren fra
> ram til register?

Det kommer an på hvad der bedst kan betale sig. Det er op til compileren
hvilke variable der får registre.

Mvh
Kent
--
"So there I was surrounded by all these scary creatures
They were even scarier than what Microsoft call features"
- C64Mafia: Forbidden Forest (Don't Go Walking Slow).

Janus (09-05-2007)
Kommentar
Fra : Janus


Dato : 09-05-07 16:49

> reg,reg er hurtigere, reg,konstant skal læse en ekstra gang fra RAM. Så
> selv i konstant-tilfældet vil compileren smide konstanten i et register
> (hvis det kan betale sig).

True... for store konstanter er det reelt reg,ram for reg,konstant. Mener
dog at huske at der er en real mode 386 maskinkode der fungerer på små
konstanter. under en byte i størelse. Konstanten er kodet ind i den
relevante opcode ligesom for meget små jumps. Det mener jeg i hvert fald,
men det er godt nok 5+ år siden at jeg lavede min 386 relamode emulator,
hvor jeg rodede med maskinkoden. Kan huske forkert



Arne Vajhøj (13-05-2007)
Kommentar
Fra : Arne Vajhøj


Dato : 13-05-07 01:12

Janus wrote:
> Jeg ville teste en banal funktion i to udgaver. Begge kører et loop af en
> vis længde. Den ene får antal itterationer som template argument, og den
> anden får det som parameter.
> Jeg forventede templateudgaven ville være hurtigst, men det er den ikke.

Jeg vil godt advare lidt mod mentaliteten om at vælge
kode stil udfra hvad der var hurtigst ved en test af
X compileren version Y på platform Z.

Du har ingen garati for at de samme karakteristika vil
gælde for andre X, Y og Z.

Eller lidt mindre abstrakt: du ved ikke om din valgte
løsning faktisk er langsomst efter næste compiler
opgradering.

Derfor:
1) vælg sunde algoritmer (god big O egenskaber)
2) skriv pæn kode der er nem at vedligeholde

Og fokuser mindre på om en mikro-benchmark viser
at man ved at lave en eller anden speciel optimering.

Arne

Søg
Reklame
Statistik
Spørgsmål : 177417
Tips : 31962
Nyheder : 719565
Indlæg : 6407864
Brugere : 218876

Månedens bedste
Årets bedste
Sidste års bedste