Il me semble qu'on peut implémenter les exceptions en se contenant de stocker un pointeur vers le dernier "exception handler" placé sur la pile, et se contenter d'y revenir. Ça fait un coût léger pour l'installation de l'exception handler (il faut mettre les informations sur la pile, comme quand on appelle une fonction), et pour le lancement de l'exception c'est équivalent à un appel terminal.Le raise tout comme le try sont relativement coûteux, puisqu'ils demandent une sauvegarde et une restauration de l'environnement d'exécution.
Ce qui est exceptionnel ou non dépend des applications. Dans de nombreux usages des tables de hachage tu peux garantir que tous les accès se feront sur des éléments existants.
J'aime bien aussi utiliser les type option pour les erreurs, mais je trouve que tu es trop catégorique contre les exceptions : ce n'est pas 1000 fois plus laid (quand les exceptions sont bien documentées, surtout à l'interface du module), et ce n'est pas beaucoup plus lent.
Si tu as des benchmarks concrets qui montrent une différence sensible de vitesse, je suis intéressé. Je sais qu'on peut écrire des micro-benchmarks en faveur de l'une ou l'autre solution (je soupçonne le fait que les types options sont légèrement plus efficaces quand le retour "exceptionnel" est fait directement par la fonction appelée, et moins efficaces quand on traverse plusieurs appels imbriqués qui utilisent tous le résultat comme une valeur), mais je pense que tu as tort et que sur un code réaliste qui ne fait pas que ça, les exceptions ne sont pas sensiblement plus lentes.
Pour moi l'avantage et l'inconvénient des monades d'exception (type option, etc.) n'est pas du tout lié aux questions de performances : c'est le fait qu'elles fassent apparaître les erreurs dans le type de retour de la fonction et qu'elles forcent l'appelant à toujours gérer le cas s'il veut une valeur. C'est souvent une bonne chose, mais parfois désagréable. Je crois qu'il n'y a pas une solution qui soit parfaite dans tous les cas, et qu'il faut accepter que les gens fassent des choix différents.
Partager