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