Voici quelques folie pour vous, en fait, je suis allé et l'a mesuré. Bloody hell, imaginez que. Je crois que j'ai quelques résultats significatifs.
J'ai utilisé un dual core P4, fonctionnant sous Windows, en utilisant mingw gcc 4.4, la construction avec "gcc toto.c -o foo.exe -std=c99 -Wall-O2".
J'ai testé la méthode 1 et la méthode 2 de l'original post. D'abord gardé le malloc en dehors de l'indice de référence de la boucle. Méthode 1 était de 48 fois plus rapide que la méthode 2. Bizarrement, retrait -O2 à partir de la commande de construction fait l'exe résultant 30% plus vite (n'ont pas cherché à savoir pourquoi encore).
Ensuite, j'ai ajouté un malloc et free à l'intérieur de la boucle. Qui a ralenti la méthode 1 par un facteur de 4.4. Méthode 2 ralentie par un facteur de 1,1.
Donc, malloc + strlen + gratuit NE dominent PAS le profil assez pour faire éviter sprintf la peine.
Voici le code que j'ai utilisé (à part les boucles ont été mis en œuvre avec < au lieu de != mais qui a fait déborder le rendu HTML de ce post):
void a(char *first, char *second, char *both)
{
for (int i = 0; i != 1000000 * 48; i++)
{
strcpy(both, first);
strcat(both, " ");
strcat(both, second);
}
}
void b(char *first, char *second, char *both)
{
for (int i = 0; i != 1000000 * 1; i++)
sprintf(both, "%s %s", first, second);
}
int main(void)
{
char* first= "First";
char* second = "Second";
char* both = (char*) malloc((strlen(first) + strlen(second) + 2) * sizeof(char));
// Takes 3.7 sec with optimisations, 2.7 sec WITHOUT optimisations!
a(first, second, both);
// Takes 3.7 sec with or without optimisations
//b(first, second, both);
return 0;
}