C++ 約3分

FollyでC++のパフォーマンスを高める

Share this article
FollyでC++のパフォーマンスを高める

Facebookが開発した Folly ライブラリは、C++標準ライブラリを補完し、C++アプリケーションのパフォーマンスを向上させるために設計された、再利用可能なC++ライブラリコンポーネントのコレクションです。Follyは効率性に重点を置き、パフォーマンス重視のアプリケーションで特に有用な、高度に最適化されたコンポーネントを提供します。このライブラリの主なパフォーマンス指向の機能は次のとおりです:

1. 効率的なデータ構造

Follyは、パフォーマンスに最適化されたいくつかのデータ構造を提供しています:

  • folly::small_vector:インラインストレージ用の小さなバッファを含む、最適化されたvector風コンテナ。小さいサイズでのヒープ割り当てを減らし、キャッシュ局所性とパフォーマンスを向上させます。
  #include <folly/small_vector.h>

  void example() {
      folly::small_vector<int, 5> vec;
      for (int i = 0; i < 10; ++i) {
          vec.push_back(i);
      }
  }
  • folly::F14 ハッシュテーブル:高効率なハッシュテーブル実装(F14ValueMapF14NodeMapF14VectorMap、およびそれらのset相当)。これらのハッシュテーブルは、従来のハッシュテーブルよりも優れた挿入・検索パフォーマンスと、より効率的なメモリ使用を提供します。
  #include <folly/container/F14Map.h>

  void example() {
      folly::F14FastMap<int, std::string> map;
      map[1] = "one";
      map[2] = "two";
  }
  • folly::AtomicHashMap:高速なロックフリー操作が必要なシナリオ向けに設計された、高度に並行なハッシュマップ。
  #include <folly/AtomicHashMap.h>

  void example() {
      folly::AtomicHashMap<int, std::string> map(100);
      map.insert(1, "one");
      map.insert(2, "two");
  }

2. 並行性と並列性

Follyは、マルチスレッド環境でのパフォーマンスを向上させる高度な並行プリミティブとユーティリティを提供しています:

  • folly::Futurefolly::Promise:これらは非同期計算とコールバックを処理する便利な方法を提供し、効率的でスケーラブルな並行性を実現します。
  #include <folly/futures/Future.h>
  #include <iostream>

  void example() {
      folly::Promise<int> promise;
      auto future = promise.getFuture();

      future.thenValue([](int value) {
          std::cout << "Received: " << value << std::endl;
      });

      promise.setValue(42);
  }
  • folly::CPUThreadPoolExecutor:CPUバウンドなタスクに最適化されたスレッドプール実装で、設定可能な並行レベルと効率的なタスクスケジューリングを提供します。
  #include <folly/executors/CPUThreadPoolExecutor.h>
  #include <folly/futures/Future.h>
  #include <iostream>

  void example() {
      folly::CPUThreadPoolExecutor executor(4); // 4 threads
      auto future = folly::makeFuture()
                      .via(&executor)
                      .thenValue([](auto) {
                          std::cout << "Task executed in thread pool." << std::endl;
                          return 42;
                      });
      future.wait();
  }

3. メモリ管理

Follyは、メモリ管理を最適化し、フラグメンテーションを削減し、割り当て・解放のパフォーマンスを改善するユーティリティとアロケータを含んでいます:

  • folly::Arena:多くの小さな割り当てと解放が発生するシナリオ向けに設計された効率的なメモリアロケータで、オーバーヘッドを最小化しキャッシュ局所性を向上させます。
  #include <folly/memory/Arena.h>

  void example() {
      folly::SysArena arena;
      int* p = static_cast<int*>(arena.allocate(sizeof(int)));
      *p = 42;
  }

4. 文字列操作

Follyは、標準ライブラリの対応物を上回るように設計された、いくつかの最適化された文字列ユーティリティを提供しています:

  • folly::fbstring:多くのシナリオで std::string を上回るように設計された高度に最適化された文字列実装。特にスモールストリング最適化とメモリオーバーヘッドの削減において優れています。
  #include <folly/FBString.h>

  void example() {
      folly::fbstring str = "Hello, Folly!";
      std::cout << str << std::endl;
  }

5. シリアライズとデシリアライズ

Follyは、効率的なシリアライズおよびデシリアライズユーティリティを提供しています:

  • folly::io::Cursorfolly::io::QueueAppender:これらのクラスは、バイトストリームへの読み書きのための効率的なメカニズムを提供し、高性能ネットワークアプリケーションで重要です。
  #include <folly/io/IOBuf.h>
  #include <folly/io/Cursor.h>

  void example() {
      auto buf = folly::IOBuf::create(100);
      folly::io::QueueAppender appender(buf.get(), 0);
      appender.writeBE<uint32_t>(42);

      folly::io::Cursor cursor(buf.get());
      uint32_t value = cursor.readBE<uint32_t>();
      std::cout << value << std::endl;
  }

6. ベンチマークとテスト

Follyは、開発者がパフォーマンスを効果的に測定・最適化するのに役立つベンチマークおよびテストユーティリティを含んでいます:

  • folly::Benchmark:コードスニペットのパフォーマンスを測定するための軽量ベンチマークフレームワーク。
  #include <folly/Benchmark.h>

  void example() {
      folly::runBenchmarks();
  }

Follyライブラリのこれらのコンポーネントとユーティリティを活用することで、C++開発者は高性能でスケーラブル、かつ保守しやすいアプリケーションを書くことができます。最適化されたデータ構造、効率的なメモリ管理、高度な並行プリミティブ、強力な文字列操作ツールの組み合わせにより、Follyはパフォーマンス重視のソフトウェア開発における貴重な資産となっています。

Share this article