Comment Google personnalise la bibliothèque standard C++ pour ses besoins
Imaginez écrire du code pour des systèmes qui traitent des milliards de requêtes. La bibliothèque standard C++ (STL) est bonne, mais parfois son universalité devient un goulot d'étranglement. Quelque part il manque des performances de table de hachage, quelque part la manipulation pratique des dates est absente, et certaines fonctionnalités des nouvelles normes C++20 ou C++23 que vous souhaitez utiliser immédiatement, sans attendre les mises à jour du compilateur sur tous les serveurs.
C'est exactement ainsi qu'Abseil est né. Ce n'est pas un remplacement de la STL, mais une extension que Google utilise dans ses projets internes comme Search, Ads et Maps. Les développeurs ont simplement pris du code prouvé au fil des années et l'ont libéré en open source.
Ce qu'il y a à l'intérieur de ce couteau suisse
Si vous explorez le dépôt abseil-cpp, vous trouverez des dizaines de bibliothèques. Mais je vais mettre en avant celles qui changent vraiment le développement au quotidien.
Swiss Tables : quand std::unordered_map est trop lent
Dans Abseil, il existe des familles de conteneurs absl::flat_hash_map et absl::flat_hash_set. Google les appelle « Swiss tables ». Contrairement au standard std::unordered_map, qui utilise des listes chaînées pour la résolution des collisions, Abseil utilise l'adressage ouvert et les instructions SIMD pour la recherche. En pratique, cela offre un gain de vitesse notable et des économies de mémoire grâce à une meilleure locality du cache.
Manipulation intelligente des chaînes
La bibliothèque strings est un sauveur pour ceux qui en ont marre d'écrire du code répétitif pour des tâches basiques. Par exemple, absl::StrCat et absl::StrAppend fonctionnent plus vite que les opérateurs habituels + ou std::stringstream car ils précalculent la taille du buffer nécessaire et évitent les allocations inutiles. Et absl::StrSplit vous permet de diviser les chaînes avec une seule ligne de code avec des filtres flexibles.
Gestion des erreurs sans exceptions
De nombreux grands projets désactivent les exceptions en C++ pour des raisons de surcharge ou de sécurité. Dans Abseil, il y a absl::Status et absl::StatusOr<T> pour cela. C'est une façon élégante de retourner soit un résultat, soit un code d'erreur avec une description textuelle depuis une fonction. Si vous avez déjà travaillé avec Go ou Rust, cette approche vous semblera très familière et logique.
Synchronisation et temps
Au lieu du standard std::mutex, ils proposent absl::Mutex. Il est conçu pour être plus efficace sous forte contention de threads. Et la bibliothèque time simplifie considérablement le travail avec les fuseaux horaires et les intervalles par rapport au std::chrono surchargé.
Philosophie technique : Live at Head
Abseil a une caractéristique qui peut soit repousser, soit attirer. Google promeut le concept « Live at Head ». Cela signifie qu'ils recommandent de toujours construire le projet à partir de la dernière version master.
Les développeurs s'efforcent de ne pas casser l'API, mais si c'est nécessaire pour améliorer la bibliothèque, ils le feront. Pour faciliter la vie des utilisateurs, Abseil fournit des outils pour le refactoring automatique du code vers les nouvelles versions de l'API. Pour ceux qui ne sont pas prêts pour de telles aventures, il existe des versions LTS, mais l'accent principal est mis sur l'avancement.
Le projet prend en charge la construction avec Bazel et CMake. Si vous utilisez déjà Bazel, intégrer Abseil ne prendra que quelques minutes.
À qui cela s'adresse
Je recommanderais de regarder Abseil de plus près dans deux cas.
Premièrement, si vous écrivez un backend à forte charge. Remplacer les maps standard par absl::flat_hash_map donne parfois un gain de performance gratuit, sans réécrire la logique.
Deuxièmement, si vous êtes bloqué sur un ancien standard C++ (par exemple C++17), mais que vous souhaitez vraiment utiliser les fonctionnalités de C++20. Abseil backporte souvent les nouvelles capacités du langage, les rendant disponibles sur des compilateurs plus anciens.
Abseil n'est pas qu'une collection d'utilitaires, mais une réflexion de la façon dont le code est écrit dans l'une des entreprises les plus technologiquement avancées au monde. La bibliothèque est immense, parfois complexe, mais d'une qualité incroyablement élevée. Si vous avez besoin de plus que ce que la bibliothèque standard offre ou si vous vous battez pour chaque pourcentage de performance, c'est définitivement un outil qui mérite d'être dans votre arsenal.
La meilleure façon de commencer à apprendre est avec le guide officiel, car le README dans le dépôt est assez bref et sert davantage de carte des dossiers du projet.
Projets similaires