Googleが標準C++ライブラリを自社向けにカスタマイズする方法
数十億のリクエストを処理するシステムのコードを書くことを想像してみてください。C++標準ライブラリ(STL)は優れていますが、その汎用性がボトルネックになることがあります。ハッシュテーブルのパフォーマンスが足りない場所、便利な日付処理が欠けている場所、そして今すぐに使いたい新しいC++20やC++23標準のある機能が、すべてのサーバーでコンパイラのアップデートを待つことなく。
まさにそのような経緯でAbseilが生まれました。STLの代替品ではなく、GoogleがSearch、Ads、Mapsなどの内部プロジェクトで使用している拡張機能です。開発者たちは長年にわたって実証されたコードをそのままオープンソースとして公開しました。
この瑞士軍刀の中身に迫る
abseil-cppリポジトリを覗くと、何十ものライブラリが見つかります。しかし、日常の開発を本当に変えるものを強調します。
Swiss Tables:std::unordered_mapが遅すぎる場合
Abseilにはコンテナファミリーであるabsl::flat_hash_mapとabsl::flat_hash_setがあります。Googleはこれを「Swiss Tables」と呼んでいます。標準のstd::unordered_mapが衝突解決に連結リストを使用するのに対し、AbseilはオープンアドレッシングとSIMD命令をルックアップに使用します。実際には、これは顕著な速度向上とキャッシュ局所性によるメモリ節約を提供します。
スマートな文字列処理
stringsライブラリは、基本的なタスクのボイラープレート記述に厌倦している人にとって命綱です。例えば、absl::StrCatとabsl::StrAppendは通常の+やstd::stringstream演算子より高速に動作します。これは必要なバッファサイズを事前計算し、不必要なアロケーションを避けるからです。そして、absl::StrSplitは柔軟なフィルタリングを持つ1行のコードで文字列を分割できます。
例外なしの錯誤処理
多くの大規模プロジェクトでは、オーバーヘッドやセキュリティ上の理由からC++の例外を無効にしています。Abseilにはそのためのabsl::Statusとabsl::StatusOr<T>があります。これは関数から結果またはエラーコードとテキスト説明のいずれかを返すエレガントな方法です。GoやRustで開発したことがあるなら、このアプローチは非常に馴染み深く論理的だと思います。
同期と時間
標準のstd::mutexの代わりに、absl::Mutexを提供しています。これは高いスレッド競合下でより効率的に動作するように設計されています。そして、timeライブラリは、過負荷なstd::chronoよりもタイムゾーンや間隔の操作をずっとシンプルにします。
技術哲学:Live at Head
Abseilには、嫌悪するか惹かれるかのどちらかになる特性が1つあります。Googleは「Live at Head」という概念を推進しています。これは常に最新バージョンのmasterからビルドすることを推奨意味します。
開発者はAPIを壊さないように努めていますが、ライブラリの改善に必要な場合はそうします。ユーザーの生活を楽にするために、Abseilは新しいAPIバージョンへの自動コードリファクタリングツールをバンドルしています。こんな冒険 готовностьされていない人のためにLTSリリースがありますが、メインの焦点は前進にあります。
プロジェクトはBazelとCMakeでのビルドをサポートしています。Bazelを既に使用している場合、Abseilの統合はほんの数分で完了します。
誰が使うべきか
2つのケースでAbseilを詳しく見ることをお勧めします。
まず、高負荷バックエンドを書いている場合です。標準マップをabsl::flat_hash_mapに置き換えると、ロジックを書き直さずに無料でパフォーマンス向上が得られることがあります。
次に、(例えばC++17のような)古いC++標準に縛られているが、ぜひC++20の機能を使いたい場合。Abseilは多くの場合、新しい言語機能をバックポートし、古いコンパイラでも利用できるようにします。
Abseilは単なるユーティリティのコレクションではなく、世界で最も技術的に進んだ企業の1つでのコードの書き方を反映しています。このライブラリは巨大で、時には複雑ですが、信じられないほど高品質です。標準ライブラリが提供するもの以上が必要な場合や、パフォーマンスのあらゆるパーセントを争っている場合、これは確かに持つべきツールです。
学習的最佳の方法は公式ガイドから始めることです。リポジトリのREADMEは非常に簡潔で、更多的是プロジェクトフォルダのマップとして機能しています。
関連プロジェクト