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
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
#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
0: 1842
1: 3130
2: 31657
3: 43903