Astuce en langage C : utilisez probable et improbable avec if pour accélérer l'exécution du code

Dans la programmation monopuce/embarquée, les exigences de vitesse sont relativement élevées. Probable et peu probable sont une meilleure technique, qui convient aux situations où il y a des branches if-else et vous savez laquelle a une probabilité d'occurrence plus élevée.

Article de référence : Compétences en langage C : utilisez probable et improbable avec if pour accélérer l'exécution du code

1.probable和peu probable

Ce sont deux macros qui indiquent au compilateur quelle condition est la plus susceptible de se produire lorsqu'il existe une branche if-else. Optimisez la structure de branche if-else. Probable signifie que la branche si a une forte probabilité de se produire, et improbable signifie que la branche si a une forte probabilité de ne pas se produire.

 #define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0)

__builtin_expect est une fonction intégrée au compilateur dont le prototype est long __builtin_expect (long exp, long c).

Hors sujet : !! est une technique de traitement des expressions logiques en langage C. Comme il n'y a pas de variables booléennes en langage C, les valeurs booléennes sont remplacées par des entiers, 0 est faux et non nul est vrai. Lorsque x vaut 0, !(x) vaut 1, !!(x) vaut 0 et l'opération de !! n'a pas de sens ; mais quand x est différent de zéro (comme 100), !(x) vaut 0, !! (x) vaut 1, ce qui a pour effet de mapper toutes les valeurs non nulles (telles que 100) sur 1.

exemple:

Si une telle fonction existe :

int fun(int a){
   
     if(a>100)  ......}

Dans les conditions de fonctionnement réelles, a>100 est peu susceptible de se produire. Alors écrivez-le comme ceci :

int fun(int a){
   
     if(unlikely(a>100))  ......}

De même, si la situation réelle est que a>100 est plus, utilisez ​probable.

2. Remarque

1. L'utilisation de probable et improbable doit être jugée avec précision, et l'écriture inversée ralentira la vitesse de course.

2. L'optimisation au moment de la compilation doit généralement utiliser au moins l'option -O2, sinon l'optimisation ne fonctionnera pas.

3. S'il peut être utilisé est lié au compilateur, gcc peut, clang semble pouvoir, msvc ne semble pas pouvoir.

3. Principe

Lorsque le compilateur compile et génère du code assembleur, il ajustera la position du code dans la branche if sous la direction des options de compilation. S'il est probablement modifié, il sera ajusté au premier plan, et s'il est peu probable qu'il soit modifié, il sera ajusté à l'arrière. Mettre le code au premier plan peut économiser le temps supplémentaire causé par l'instruction de saut, de manière à atteindre l'objectif d'amélioration de l'efficacité.

Les processeurs d'aujourd'hui disposent de mécanismes ICache et de pipeline. Lors de l'exécution de l'instruction actuelle, ICache prélèvera les instructions suivantes pour améliorer l'efficacité de fonctionnement. Mais si la branche conditionnelle n'est pas satisfaite, elle passera à d'autres instructions et les instructions prérécupérées seront inutiles, ce qui réduira l'efficacité du pipeline.

Si vous utilisez probable et improbable pour dire au compilateur ce qui est le plus susceptible de se produire, le compilateur placera le code avec une forte probabilité d'exécution en première position, ce qui peut grandement améliorer le taux de réussite des valeurs de prélecture d'instructions, atteignant ainsi l'objectif. d'améliorer l'efficacité.

 

Je suppose que tu aimes

Origine blog.csdn.net/freestep96/article/details/128771498
conseillé
Classement