Les codes fantastiques : une prédiction exceptionnelle

Magazine
Marque
GNU/Linux Magazine
Numéro
263
Mois de parution
mai 2023
Spécialité(s)


Résumé

Continuons cette série sur les codes fantastiques avec un code exceptionnel et inattendu


Body

Lors d’une relecture de code autour de l’attribut [[likely]] (introduit en C++20 pour marquer le test d’une branche qui a de fortes chances de s’évaluer à vrai), je me suis rendu compte d’un choix amusant fait par le compilateur Clang quand il compile une branche qui lève une exception. Mais commençons par le commencement. Le code suivant :

int bar();
int foo(bool val) {
  if(val)
    return bar();
  return 1;
}

est traduit par Clang (avec le drapeau -O2) en l’assembleur que voici :

foo(bool):
        test    edi, edi
        je      .LBB0_1
        jmp     bar()@PLT
.LBB0_1:
        mov     eax, 1
        ret

Cet agencement du code favorise le cas où val est vrai (exécution plus rapide, car pas de sauts, meilleure localité dans le cache d’instruction, etc.).

Cependant, si au lieu de retourner la valeur produite par bar, on l’utilise pour lever une exception :

int foo(bool val) {
  if(val)
    throw bar();
  return 1;
}

Le compilateur considère que la branche qui lève une exception est... exceptionnelle, donc peu probable et il favorisera alors l’autre branche, et il génère alors l’assembleur suivant :

        ...
        test    edi, edi
        jne     .LBB0_1
        mov     eax, 1
        ...

On peut rendre la branche vraie à nouveau plus probable en lui attachant l’attribut [[likely]] et notre exception redevient plus probable, ce qui reste un peu contraire à l’usage canonique d’une exception :

int foo(bool val) {
  if(val) [[likely]]
    throw bar();
  return 1;
}

Il reste intéressant de voir que le compilateur Clang possède une heuristique de prédiction de branchement pour le traitement des exceptions, et qu’on peut reprendre la main tout en restant sur des attributs standard ! Pour les curieux, je vous laisse tester GCC sur le même code, les heuristiques sont différentes :-).



Article rédigé par

Par le(s) même(s) auteur(s)

Crévindiou, c’est pas du bon C d’chez nous ça, cé du C deu’l ville !

Magazine
Marque
GNU/Linux Magazine
Numéro
267
Mois de parution
janvier 2024
Spécialité(s)
Résumé

IANAL (I Am Not A Linguist), mais quand j’entends du québécois, je ne comprends pas tout, mais je comprends. Mais qu’en est-il des dialectes du langage C ? Car oui, le langage C a des dialectes, et nous allons voyager un peu à travers l’un d’entre eux, le dialecte GNU, supporté principalement par GCC, mais aussi, en partie, par Clang.

Les derniers articles Premiums

Les derniers articles Premium

Générez votre serveur JEE sur-mesure avec Wildfly Glow

Magazine
Marque
Contenu Premium
Spécialité(s)
Résumé

Et, si, en une ligne de commandes, on pouvait reconstruire son serveur JEE pour qu’il soit configuré, sur mesure, pour les besoins des applications qu’il embarque ? Et si on pouvait aller encore plus loin, en distribuant l’ensemble, assemblé sous la forme d’un jar exécutable ? Et si on pouvait même déployer le tout, automatiquement, sur OpenShift ? Grâce à Wildfly Glow [1], c’est possible ! Tout du moins, pour le serveur JEE open source Wildfly [2]. Démonstration dans cet article.

Bénéficiez de statistiques de fréquentations web légères et respectueuses avec Plausible Analytics

Magazine
Marque
Contenu Premium
Spécialité(s)
Résumé

Pour être visible sur le Web, un site est indispensable, cela va de soi. Mais il est impossible d’en évaluer le succès, ni celui de ses améliorations, sans établir de statistiques de fréquentation : combien de visiteurs ? Combien de pages consultées ? Quel temps passé ? Comment savoir si le nouveau design plaît réellement ? Autant de questions auxquelles Plausible se propose de répondre.

Les listes de lecture

9 article(s) - ajoutée le 01/07/2020
Vous désirez apprendre le langage Python, mais ne savez pas trop par où commencer ? Cette liste de lecture vous permettra de faire vos premiers pas en découvrant l'écosystème de Python et en écrivant de petits scripts.
11 article(s) - ajoutée le 01/07/2020
La base de tout programme effectuant une tâche un tant soit peu complexe est un algorithme, une méthode permettant de manipuler des données pour obtenir un résultat attendu. Dans cette liste, vous pourrez découvrir quelques spécimens d'algorithmes.
10 article(s) - ajoutée le 01/07/2020
À quoi bon se targuer de posséder des pétaoctets de données si l'on est incapable d'analyser ces dernières ? Cette liste vous aidera à "faire parler" vos données.
Voir les 64 listes de lecture

Abonnez-vous maintenant

et profitez de tous les contenus en illimité

Je découvre les offres

Déjà abonné ? Connectez-vous