69 votes

Pourquoi ce code utilise-t-il strlen 6,5 fois plus lentement avec les optimisations GCC activées?

Je voulais comparer la fonction glibc de strlen pour une raison quelconque et j'ai découvert qu'elle fonctionne apparemment beaucoup plus lentement avec les optimisations activées dans GCC et je ne sais pas pourquoi.

Voici mon code:

 #include <time.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>

int main() {
    char *s = calloc(1 << 20, 1);
    memset(s, 65, 1000000);
    clock_t start = clock();
    for (int i = 0; i < 128; ++i) {
        s[strlen(s)] = 'A';
    }
    clock_t end = clock();
    printf("%lld\n", (long long)(end - start));
    return 0;
}

Sur ma machine, il sort:

 $ gcc test.c && ./a.out
13336
$ gcc -O1 test.c && ./a.out
199004
$ gcc -O2 test.c && ./a.out
83415
$ gcc -O3 test.c && ./a.out
83415

D'une manière ou d'une autre, l'activation des optimisations le fait s'exécuter plus longtemps.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X