logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[c] itoa vs. sprintf test szybkości na mojej atmedze8

krdln 01 Sty 2011 20:35 1953 3
REKLAMA
  • #1 8944687
    krdln
    Poziom 13  
    Ostatnio przeczytałem, że funkcja itoa jest szybsza niż sprintf, jednak ma o wiele mniejsze możliwości, dlatego postanowiłem zrobić test szybkości na mojej atmedze8. Oto fragment kodu
    #include <stdio.h>
    #include <stdlib.h>
    uchar _STwynik[8];
    
    void czas_start(char p) {
    	TCNT1 = 0;
    	TCCR1B = p;
    }
    
    uint czas_stop() {
    	TCCR1B = 0;
    	return TCNT1;
    }
    
    void speed_test() {
    	char str[8];
    	uint* cztery = (uint*)_STwynik;
    uint i,j;
    	
    	show(2);
    	for (i=3; i<=5; i+=2) {
    		show(8);
    		if (i==3) j=200;
    		else j=30000;
    		czas_start(i);
    		while (j--) {
    			itoa(j,str,10);
    		}
    		cztery[i-3] = czas_stop();
    		
    		show(8+2);
    		if (i==3) j=200;
    		else j=30000;
    		czas_start(i);
    		while (j--) {
    			sprintf(str,"%d",j);
    		}
    		cztery[i-3+1] = czas_stop();
    	}
    }


    Wyniki prezentują się następująco:

    liczby od 1 do 200:
    itoa: 117952 cykli, średnio 589 na jedną konwersję
    sprintf: 200320 cykli, średnio 1001 na jedną konwersję


    liczby od 1 do 30000:
    itoa: 32415744 cykli, średnio 1080 na jedną konwersję
    sprintf: 44956672 cykli, średnio 1498 na jedną konwersję

    Oceńcie sami :) Spodziewałem się, że sprintf przegra bardziej. Jeśli ktoś wątpi w wiarygodność obliczeń, oto wynikowa tablica cztery
    0: 1842
    1: 3130
    2: 31657
    3: 43903
    
  • REKLAMA
  • REKLAMA
  • #3 8944845
    krdln
    Poziom 13  
    (kompiluję z -Os)
    tmf napisał:
    A sprawdziłeś jak wygląda objętość kodu po itoa, a sprintf?

    Teraz już tak, różnica powala :D Wygląda na to, że itoa zajmuje 172 bajty, a sprintf 1522. Jednak mnie ciekawiła szybkość działania, i pod tym kątem testowałem funkcje. Poza tym używam atmegi8 oraz 168; jeszcze problemów z pamięcią nigdy nie miałem.
  • #4 8945401
    Fredy
    Poziom 27  
    W Helpie CV znalazłem coś takiego:

    int sprintf(char *str, char flash *fmtstr [ , arg1, arg2, ...]) 
    
    
    this function is identical to printf except that the formatted text is placed in the null terminated character string str.
    The function returns the number of outputed characters.
    


    jeśli jest identyczna czy podobna do printfa to wszystko jasne.
REKLAMA