2 votes

Est-ce que __attribute__((optimize(0))) s'applique "de manière récursive" ?

Dites que je veux utiliser une fonction pour mesurer le temps d'exécution, je veux éviter que le compilateur n'optimise les expressions simplement parce qu'il pense qu'elles ne font rien (elles ne font rien, sauf que je veux mesurer le temps qu'elles mettent à calculer). Au lieu de faire des astuces bizarres comme les ajouter dans une autre variable, j'ai découvert __atribute__((optimize(0))) dans GCC. Cependant, disons que j'ai ce code :

__attribute__((optimize(0))) void test(int n) {
    while (n--) {
        foo();
    }
}

int main() {
    std::cout << Timer::measure(test).count() << "ms\n";
}

L'attribut empêcherait-il le compilateur d'optimiser le code à l'intérieur de la fonction foo() également ? Je veux vraiment juste tester quelques temps d'exécution et empêcher de manière fiable et relativement facile le compilateur de supprimer complètement le code (je veux qu'il optimise le code autant qu'il le peut, mais ne le supprime pas parce qu'il ne fait rien !).

Cela a-t-il un sens ? Merci d'avance !

1voto

smoothware Points 585

J'ai juste pensé que je pourrais faire une expérience (pourquoi n'y ai-je pas pensé plus tôt), voici ce que j'ai fait :

// basculez cela
// __attribute__((optimize(0)))
void waste_time() { for (unsigned i = 100000; i--; ); }

// laissez toujours ceci activé
__attribute__((optimize(0)))
void test() {
    for (unsigned i = 1000; i--; ) {
        waste_time();
    }
}

int main() {
    std::cout << Timer::measure(test).count() << "ms\n";
}

Ce que j'ai trouvé avec -O3 :

temps perdu sans optimisations : 196.972ms (évidemment la boucle n'est pas optimisée)
temps perdu avec optimisations : 0.001995ms (la boucle est optimisée)

Pour moi, c'est très clair, l'attribut ne "propage" pas aux appels de fonctions imbriquées, donc waste_time() sera toujours optimisé même si test() a l'attribut spécifié.

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