|
| 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
| |
|
|