Hoe Google de standaard C++-bibliotheek aanpast aan zijn behoeften
Stel je voor dat je code schrijft voor systemen die miljarden verzoeken verwerken. De C++ Standard Library (STL) is goed, maar soms wordt de universaliteit ervan een bottleneck. Ergens ontbreekt hash-tabelprestaties, ergens ontbreekt handige datumafhandeling, en sommige functies uit de nieuwe C++20- of C++23-standaarden wil je nu al gebruiken, zonder te wachten op compiler-updates op alle servers.
Zo is Abseil ontstaan. Het is geen vervanging voor STL, maar een uitbreiding die Google gebruikt in zijn interne projecten zoals Search, Ads en Maps. Ontwikkelaars hebben simpelweg code genomen die in de loop der jaren is bewezen en deze als open source vrijgegeven.
Wat zit er in deze Zwitsarse zakmes
Als je in de abseil-cpp-repository kijkt, vind je tientallen bibliotheken. Maar ik zal diegene belichten die de dagelijkse ontwikkeling echt veranderen.
Swiss Tables: wanneer std::unordered_map te traag is
In Abseil zijn er containergeslachten absl::flat_hash_map en absl::flat_hash_set. Google noemt ze "Swiss tables". In tegenstelling tot standaard std::unordered_map, dat gekoppelde lijsten gebruikt voor botsingsoplossing, gebruikt Abseil open addressing en SIMD-instructies voor opzoekingen. In de praktijk levert dit een merkbare snelheidsverbetering en geheugenbesparing op door betere cache-localiteit.
Slimme stringverwerking
De strings bibliotheek is een redder in de nood voor wie het beu is om boilerplate te schrijven voor basistaken. Bijvoorbeeld, absl::StrCat en absl::StrAppend werken sneller dan de gebruikelijke +- of std::stringstream-operatoren omdat ze de vereiste buffergrootte vooraf berekenen en onnodige allocaties vermijden. En absl::StrSplit laat je strings splitsen met slechts één coderegel met flexibele filters.
Foutafhandeling zonder exceptions
Veel grote projecten schakelen exceptions in C++ uit vanwege overhead of beveiligingsoverwegingen. In Abseil is hier absl::Status en absl::StatusOr<T> voor. Dit is een elegante manier om ofwel een resultaat ofwel een foutcode met tekstbeschrijving uit een functie te retourneren. Als je ooit met Go of Rust hebt gewerkt, zal deze aanpak je zeer bekend en logisch voorkomen.
Synchronisatie en tijd
In plaats van de standaard std::mutex bieden ze absl::Mutex. Deze is ontworpen om efficiënter te zijn bij hoge thread-conflicten. En de time bibliotheek maakt het werken met tijdzones en intervallen veel eenvoudiger dan de overbelaste std::chrono.
Technische filosofie: Live at Head
Abseil heeft één kenmerk dat je kan afstoten of aantrekken. Google promoot het "Live at Head"-concept. Dit betekent dat ze aanbevelen om het project altijd te bouwen vanaf de nieuwste masterversie.
Ontwikkelaars streven ernaar de API niet te breken, maar als het nodig is om de bibliotheek te verbeteren, zullen ze dat doen. Om het leven voor gebruikers gemakkelijker te maken, wordt Abseil geleverd met tools voor automatische coderefactoring naar nieuwe API-versies. Voor degenen die niet klaar zijn voor zulke avonturen, zijn er LTS-releases, maar de hoofdfocus ligt op vooruitgang.
Het project ondersteunt bouwen met Bazel en CMake. Als je al Bazel gebruikt, duurt integratie van Abseil slechts een paar minuten.
Voor wie is dit
Ik zou aanbevelen om in twee gevallen nader naar Abseil te kijken.
Ten eerste, als je een high-load backend schrijft. Standaard maps vervangen door absl::flat_hash_map geeft soms gratis een prestatieverbetering, zonder logica te herschrijven.
Ten tweede, als je vastzit op een oude C++-standaard (bijvoorbeeld C++17), maar graag functies uit C++20 wilt gebruiken. Abseil backport vaak nieuwe taalmogelijkheden, waardoor ze beschikbaar zijn op oudere compilers.
Abseil is niet zomaar een verzameling hulpprogramma's, maar een weerspiegeling van hoe code wordt geschreven bij een van de meest technologisch geavanceerde bedrijven ter wereld. De bibliotheek is enorm, soms complex, maar ongelooflijk hoogwaardig. Als je meer nodig hebt dan wat de standaardbibliotheek biedt of als je vecht voor elke procent prestatie, is dit zeker een tool die het waard is om in je arsenaal te hebben.
De beste manier om te beginnen met leren is met de officiële handleiding, aangezien de README in de repository vrij beknopt is en meer dient als een kaart van de projectmappen.
Gerelateerde projecten