Folly

本文介绍了Facebook的Folly开源库,特别是其高性能组件fbvector,对比了与C++标准库vector的差异,重点分析了其扩容因子和jemalloc分配器对性能的提升。同时指出Folly的一些潜在问题,如C++14依赖和静态链接库的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、概述

        Folly的全称Facebook Open-source Library,目的不是为了替代标准库,而是对标准库的一种补充,提供了许多高性能的组件,如Fbstring、FbVector等。folly库常作为FaceBook其他开源c++的依赖。

二、安装&使用

2.1 获取folly

        folly是facebook开源底层库,托管在github上面,可以从github上获取源码并进行本地编译。

git clone https://github.com/facebook/folly

2.2 编译folly

        值得注意的是,folly默认编译产物是静态链接库,可以通过设置编译选项-DFOLLY_SUPPORT_SHARED_LIBRARY=ON编译产出动态库,但是可能会很大。关于为什么编译产出为静态库,项目readme给出的原因如下:

# Install dependencies
cd folly
sudo ./build/fbcode_builder/getdeps.py install-system-deps --recursive

# compiler
mkdir _build && cd _build
cmake ../
make -j4
sudo make install

folly内部的某些实现可能会依赖fmt v10.0,可以通过以下方式安装fmt

git clone https://github.com/fmtlib/fmt.git
cd fmt
mkdir build
cd build
cmake ..
make
sudo make install

2.3 使用

        正如开源项目所说,folly是对标准库的补充,在标准库中的相关组件的性能无法满足项目需求时,folly才会着手开发,因此fbvector与C++标准库中的vector使用方式相同

#include<folly/FBVector.h>
    
folly::fbvector<int> numbers({0, 1, 2, 3});
numbers.reserve(10);
for (int i = 4; i < 10; i++) {
  numbers.push_back(i * 2);
}
assert(numbers[6] == 12);

三、性能分析

        根据开源项目FBVector.md描述,fbvector相较于标准库的vector主要进行两部分的优化:扩容因子(growth factor)分配器算法(jemalloc)

3.1 扩容因子

        为了避免二次分配,std::vector分配的内存通常呈指数增长,小的扩容因子会导致频繁扩容,大的扩容因子会导致vector消耗过多的内存。

        gcc编译器默认的扩容因子是2,这个数值会导致每次扩容新申请的空间大小总是大于之前所有使用过的的内存。但是1.5的扩容因子在4次重新分配后可以使用之前释放的内存,fbvector使用的就是1.5的扩容因子。仅仅是扩容因子的改变并不能显著提升vector的性能(Visual C++使用的扩容因子也是1.5),fbvector对vector的优化还体现在分配器上。

3.2 jemalloc

        分配器处在用户程序和内核之间,它响应用户的分配请求,向操作系统申请内存,然后将其返回给用户程序。业界常见的库包括:ptmalloc(glibc标配)、tcmalloc(google)、jemalloc(facebook)。

        C++标准库默认使用的是ptmalloc(Per thread malloc)算法,该算法是glibc默认分配算法具有很好的平台兼容性,但是其并发能力弱,分配内存时加锁操作也极大限制了分配效率,同时也更容易产生内存碎片。tcmalloc(Thread caching malloc)是Google开源的一款分配器,优化了ptmalloc的并发性能。

        jemalloc是Jason Evans于2005年开发的,侧重于减少内存碎片和提升多线程高并发场景下内存的分配效率。与其它内存分配器相比,它最大的优势在于多线程情况下的高性能以及内存碎片的减少。

3.3 benchmark

        使用Google benchmark对比std vector和fbvector的push_back()的性能。对比结果如下,bool标志位表示为是否使用的是std vector,false时使用fbvector:

3.4 总结

无论从理论实现上还是性能测试中,fbvector的性能均优于std vector;fbvector对内存管理上更加细粒,并且fbvector也广泛应用于一些对性能要求较高的工程上面。但是有一些问题值得注意:

  • folly依赖于C++14,对于一些低版本的C++项目适配可能会存在问题;
  • folly编译产物默认是静态链接库,在一定程度上会增加可执行文件的内存,也不利于OTA;

关于第二点,项目ISSUE中也有讨论,可能在真正使用中应该进行一些必要的评估。

四、参考链接

GitHub - facebook/folly: An open-source C++ library developed and used at Facebook.

内存管理特性分析(十五):内存分配器之jemalloc技术原理分析 - 知乎

内存优化总结tcmalloc与jemalloc-转载 - 知乎

存优化总结:ptmalloc、tcmalloc和jemalloc - 知乎

<think>好的,用户想了解或使用Folly,特别是使用指南或下载方法。首先,我需要回忆一下Folly的基本信息。Folly是Facebook开源的C++,专注于性能和实用性,包含各种高效的数据结构和算法。用户可能对如何下载和安装它,以及基本使用方法感兴趣。 根据引用[4],在CentOS 7上安装Folly比较麻烦,建议用Ubuntu。我需要先告诉用户系统要求,比如支持的Linux发行版和编译器版本。然后,下载步骤通常是通过Git克隆仓,但用户可能需要安装依赖项,比如CMake、g++等。安装过程可能涉及使用CMake构建和安装,这里需要详细说明步骤,但也要注意不同系统的差异。 接下来是使用指南部分,用户可能需要一个简单的示例来开始。例如,使用Folly的fbstring类,或者并发数据结构如AtomicHashMap。引用[3]提到atomic_queue常与其他异步框架结合使用,可能可以举一个多线程的例子。但要注意代码示例的正确性,确保语法正确,并且符合用户的实际应用场景。 另外,用户可能遇到安装问题,特别是依赖项缺失或编译错误。需要提醒他们查看官方文档,并确保所有依赖如Boost、Gflags安装正确。引用[4]提到安装过程复杂,可能需要特别指出常见问题,比如CentOS的依赖管理问题,建议使用Ubuntu以避免麻烦。 还要考虑用户的实际需求,他们可能是开发者,希望提高应用性能,所以需要强调Folly的优势,如高性能数据结构、并发工具等。引用[1]提到Folly帮助处理性能挑战,可以引用这一点来推荐。 最后,生成相关问题,可能涉及性能分析、具体组件的使用、与其他的对比,以及在不同系统上的安装问题。要确保问题覆盖用户可能进一步探索的方向。</think>### Folly使用指南及下载方法 Folly(Facebook Open Source Library)是Meta(原Facebook)开源的C++基础工具,专注于高性能与实用功能,包含字符串处理、并发数据结构、性能分析工具等模块[^1]。以下是关键使用指南: --- #### 一、安装指南(以Ubuntu为例) 1. **系统要求** - 支持Linux/macOS(推荐Ubuntu 20.04+/CentOS 8+) - 编译器:GCC 9+ 或 Clang 10+ - 依赖项:CMake、Git、Boost、Gflags 2. **下载与编译** ```bash # 克隆仓 git clone https://github.com/facebook/folly.git cd folly mkdir build && cd build # 编译安装 cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local make -j$(nproc) sudo make install ``` CentOS用户需手动安装更多依赖(如`libevent-devel`),建议优先使用Ubuntu[^4]。 --- #### 二、核心功能使用示例 1. **高性能字符串处理** ```cpp #include <folly/FBString.h> folly::fbstring str = "Folly测试"; str += " - 高效字符串操作"; fmt::print("{}\n", str); // 结合fmt输出[^2] ``` 2. **并发数据结构** ```cpp #include <folly/concurrency/AtomicHashMap.h> folly::AtomicHashMap<int, std::string> map(100); map.insert(1, "Value1"); auto it = map.find(1); if (it != map.end()) { fmt::print("Key 1: {}\n", it->second); } ``` 3. **异步编程支持** 结合`atomic_queue`实现任务队列[^3]: ```cpp #include <folly/MPMCQueue.h> folly::MPMCQueue<std::function<void()>> queue(100); // 生产者线程 queue.blockingWrite([] { fmt::print("Task executed\n"); }); // 消费者线程 std::function<void()> task; queue.blockingRead(task); task(); ``` --- #### 三、常见问题 1. **依赖缺失** 若编译报错,检查是否安装`libdouble-conversion-dev`、`libgflags-dev`等包。 2. **兼容性问题** 确保代码使用C++17及以上标准编译(CMake中添加`set(CMAKE_CXX_STANDARD 17)`)。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值