揭秘Facebook官方底层C++函数Folly

article/2025/11/5 20:41:02

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

Folly与Boost、当然还有std等组件库的关系是互为补充,而不是彼此竞争。实际上,只有当我们需要的东西既没有,也无法满足所需的性能要求时,我们才开始定义自己的组件。

性能问题贯穿着Folly的大部分,有时导致比较具有特质性的设计(比如PackedSyncPtr.h和SmallLocks.h)。整体上确保良好的性能是所有Folly的统一主题。

逻辑设计

Folly是一组相对独立的组件的集合体,有些组件就是几个符号这么简单。内部依赖方面没有限制,这意味着某个特定的folly模块可以使用其他任何的folly组件。

所有符号都在顶层的命名空间folly中加以定义,当然除了宏。宏名称是ALL_UPPERCASE。命名空间folly定义了其他的内部命名空间,比如internal或detail。用户代码应该不依赖那些命名空间中的符号。

物理设计

在顶层,Folly采用经典的“结巴”(stuttering)方案folly/folly,这也是Boost及其他组件库所采用的。第一个目录充当库的安装根目录(可能是以folly-1.0/这样的形式);第二个目录是添加文件时用来辨别组件库,比如#include "folly/FBString.h"。

目录结构是扁平的(模仿命名空间结构),也就是说我们没有复杂的目录层次结构(这个情况在将来的版本中可能会有变化)。子目录experimental含有在folly里面使用的文件,可能用在Facebook端,但是被认为不够稳定,无法在客户端使用。你的代码不该使用folly/experimental中的文件,以免你在更新Folly时,出现问题。

folly/folly/test子目录包括了面向所有组件的单元测试,通常名为ComponentXyzTest.cpp,面向每个ComponentXyz.*。folly/folly/docs目录含有说明文档。

兼容性

目前,folly已在64位安装版Fedora 17、Ubuntu 12.04和Debian wheezy的gcc 4.6上进行了测试。它不用改动,就可以在其他64位Linux平台上运行。

组件

下面按字母顺序介绍了一系列Folly组件,另外附有每个组件的简短描述。

Arena.h,ThreadCachedArena.h

内存分配的简单地方:多次内存分配同时被释放。使用线程版本。

AtomicHashMap.h,AtomicHashArray.h

高性能的原子哈希图,采用几乎无锁的操作。

Benchmark.h

用于代码基准测试的小型框架。客户端代码注册基准测试,可选情况下使用一个变量来规定基准测试的范围(迭代和工作集大小等)。框架运行基准测试(受制于命令行标记),生成带计时信息的格式化输出。

Bits.h

各种位处理实用组件,针对速度而优化。

Bits.h

位变换函数,使用统一接口包装ffsl(l)图元。

ConcurrentSkipList.h

实现了用证实正确的可扩展并发跳跃表(Provably Correct Scalable Concurrent Skip List)描述的结构,这种跳跃表由Herlihy及其他人共同开发。

Conv.h

各种数据转换例程(尤其是to和from字符串),针对速度和安全进行了优化。

DiscriminatedPtr.h

类似boost::variant,但完全局限于指针。使用指针中最高位、未使用的16位作为鉴别器。所以sizeof(DiscriminatedPtr<int, string, Widget>) == sizeof(void*)。

dynamic.h

动态类型对象,创建时关注JSON对象。

Endian.h

Endian转换图元。

Escape.h

以C方式转义字符串。

eventfd.h

针对eventfd系统调用的包装器。

FBString.h

嵌入式实现std::string,进行了诸多优化。

FBVector.h

基本上嵌入式实现std::vector,进行了诸多优化。

Foreach.h

伪语句(作为宏语句来实现),用于迭代。

Format.h

Python式样的格式化实用组件。

GroupVarint.h

针对32位值的Group Varint编码。

Hash.h

各种流行的哈希函数实现。

Histogram.h

一个简单的类,用于收集直方图数据。

IntrusiveList.h

方便类型定义,用于使用boost::intrusive_list。

json.h

JSON序列化器和反序列化器。使用dynamic.h。

Likely.h

针对__builtin_expect的包装器。

Malloc.h

内存分配助手,尤其是使用jemalloc时。

MapUtil.h

一种助手,用于查找联合容器中的项目(比如std::map和std::unordered_map)。

PackedSyncPtr.h

一种高度专业化的数据结构,含有指针、1位旋转锁和15位整数,它们都在一个64位单词中。

Preprocessor.h

不好但又必不可少的组件。

PrettyPrint.h

针对数字的美化打印组件,用于添加所用单元的后缀:字节(kb、MB等)、度量单位后缀(k、M和G等)以及时间(s、ms、us和ns等)。

ProducerConsumerQueue.h

无锁单读取器单写入器队列。

Random.h

只定义了一个函数:randomNumberSeed()。

Range.h

Boost式样的范围工具和StringPiece专门化。

RWSpinLock.h

快速而紧凑的读取器/写入器旋转锁。

ScopeGuard.h

老式ScopeGuard用语的C++11版本。

SmallLocks.h

非常小的旋转锁(1字节和1位)。

small_vector.h

一种向量,含有小缓冲器方面的优化和可选的嵌入式PicoSpinLock。

sorted_vector_types.h

类似std::map的集合体,但是作为排序向量来实现。

StlAllocator.h

标准模板库(STL分配器),包装简单的分配/取消分配接口。

String.h

连接folly::fbstring和std::string的字符串实用组件。

Synchronized.h

高级同步库。

System.h

解码和errno实用组件。

ThreadCachedInt.h

使用线程缓存的高性能原子增量。

ThreadLocal.h

经过改进的线程本地存储,用于存储非平凡类型。

TimeoutQueue.h

按项目设定超时的队列。

Traits.h

类型特性,补充了在标准的C++11头<traits>中定义的那些类型特性。

Unicode.h

定义了codePointToUtf8函数。

转载于:https://my.oschina.net/yangfuhai/blog/62850


http://chatgpt.dhexx.cn/article/oT24SFWO.shtml

相关文章

《设计原则》(一)

易理解性和易使用性的设计原则 提供一个好的概念模式&#xff1b;&#xff08;一个好的概念模式使用户能够预测操作的行为效果&#xff09;可视性(消除执行阶段和评估阶段的鸿沟)&#xff1b;自然匹配&#xff1b;&#xff08;利用物理环境类比和文化标准概念、空间类比&#…

C++设计模式的设计原则(面向对象八大设计原则)

面向对象设计八大设计原则 一、温故面向对象二、八大设计原则三、以史为鉴 先掌握八大设计原则&#xff0c;再详细看23种设计模式&#xff08;&#x1f448;点我&#xff09; 一、温故面向对象 &#xff08;1&#xff09;隔离变化&#xff1a;从宏观层面上来看&#xff0c;面向…

设计原则设计模式

导论 什么是设计原则&#xff1a;判断程序设计质量好坏的准则。什么是设计模式&#xff1a;软件设计过程中重复出现问题的解决方案设计原则的作用&#xff1a;指导抽象、类、类关系设计&#xff0c;相当于指导设计程序基础框架&#xff08;Rank-分层、Role-角色、Relation-类关…

设计原则详解

1.单一职责 一个类&#xff0c;只有一个引起它变化的原因。应该只有一个职责。每一个职责都是变化的一个轴线&#…

五大设计原则——SOLID

目录 简介&#xff1a; 1、单一职责原则&#xff08;SRP&#xff09; 2、开闭原则&#xff08;OCP&#xff09; 3、里式替换原则&#xff08;LSP&#xff09; 4、依赖倒置原则 (DIP) 5、接口隔离原则 (ISP) 简介&#xff1a; 无论是软件系统设计&#xff0c;还是代码实现…

1. 设计原则

文章目录 设计原则思维导图核心理论SOLID单一职责开放封闭里式替换接口隔离依赖反转 KISSDRYLOD 设计原则思维导图 核心理论 基于接口编程 “基于接口而非实现编程” - “Program to an interface, not an implementation”。 “接口”就是一组“协议”或者“约定”&#xff…

七大设计原则

一、七大设计原则 &#xff08;1&#xff09;单一职责原则 &#xff08;2&#xff09;接口隔离原则 &#xff08;3&#xff09;依赖倒置原则 &#xff08;4&#xff09;里氏替换原则 &#xff08;5&#xff09;开闭原则 &#xff08;6&#xff09;迪米特法则 &#xff0…

chrome浏览器截长图

使用chrome浏览器 打开开发者模式(更多工具->开发者工具) mac 按commandshiftp windows 按ctrlshiftp 然后输入capture 选择capture full size screenshot就可以了 截了个长图的例子

手把手教你截长图

1.截长图的工具 相信很多小伙伴在平时工作做都会碰见截图的问题&#xff0c;那正常的图&#xff0c;我们有各种方式去截取&#xff0c;例如&#xff1a;QQ的CtrlAltA&#xff0c;微信的AltA等等 但是呢&#xff0c;如果要用到长图的时候&#xff0c;就束手无策了&#xff0c;这…

python如何截长图_利用 Python + Selenium 实现对页面的指定元素截图(可截长图元素)...

对WebElement截图 WebDriver.Chrome自带的方法只能对当前窗口截屏&#xff0c;且不能指定特定元素。若是需要截取特定元素或是窗口超过了一屏&#xff0c;就只能另辟蹊径了。 WebDriver.PhantomJS自带的方法支持对整个网页截屏。 下面提供几种思路。 方式一 针对WebDriver.Chro…

谷歌浏览器怎么截长图?

我们在使用电脑浏览网页的时候难免会需要进行一些长图的截取&#xff0c;而一般的截图只能实现一部分截取&#xff0c;那么我们要如何去实现这个操作呢&#xff1f;下面小编就给大家介绍一下怎么在谷歌浏览器上截长图的操作。 谷歌浏览器网页截长图怎么截&#xff1f; 1、进入C…

html2canvas截长图

github链接 一、下载运行后选择下图的html2canvas即可直接去到路由界面测试 二、下图是html2canvas路由页面&#xff0c;点击右上角的生成图片即可下载长图 三、源码路径&#xff08;html2canvas源码github&#xff09; 四、源码&#xff08;关键在generateImage 这个方法&…

selenium+phantomjs截长图踩坑

目录 需求背景&#xff1a; 调研 phantomjs selenium 服务器部署 需求背景 BI上的报表需要设置定时任务截图发邮件到订阅人的邮箱中。刚开始以为截图的活是前端的&#xff0c;后来发现使自己的锅。 调研 截图的研究了一下&#xff0c;主流应该是 selenium 和 phantomjs。…

microsoft edge怎么截长图_实用技能 | Fireshot 网页截长图工具

FireShot 网页截长屏插件 网页截图有没有什么好方法? 在我们平常的工作、生活和学习中,截图是我们最常用到的功能之一。小编平常用到的是QQ、微信、电脑自带的快捷截图功能以及红蜻蜓截图软件等。 但是在浏览网页时,这些工具功能出现了一个致命的缺点,看到一个长长的文章,…

snipaste怎么滚动截长图_如何截长图,这3种方法你用过吗?

在工作中,经常需要截长图,那在电脑上你一般是如何操作呢?本期Word妹与大家分享2种快速截图技巧。 1、借用QQ工具 在最新的QQ版本中有一个长截图按钮,点击之后直接拉动需要长截图的内容,最后点击完成即可。 2、借用FastStone Capture工具 FSCapture是绿色版本不需要安装,可…

计算机win7截长屏,电脑截长图【应对法子】

喜欢使用电脑的小伙伴们一般都会遇到win7系统电脑截长图的问题&#xff0c;突然遇到win7系统电脑截长图的问题就不知道该怎么办了&#xff0c;其实win7系统电脑截长图的解决方法非常简单&#xff0c;按照 1&#xff1a;打开要截图的WORD文档&#xff0c;点击左上角的另存为或者…

网页截长图

很多时候我们需要在网页上截长图&#xff0c;下面记录下谷歌浏览器截长图的步骤&#xff1a; 1.在浏览器的右上角处找到三个竖着的小黑点按钮&#xff0c;点击选择该按钮&#xff0c;选择更多工具–>开发者工具 2.点击开发者工具后会显示这样的一个小窗口 3.按下CTRLShif…

分享电脑中截图的五种方法(包括截长图)

&#x1f482; 个人网站:【 海拥】【弗莱迪的物理实验】【开发文档导航】&#x1f91f; 风趣幽默的前端学习课程&#xff1a;&#x1f449;28个案例趣学前端&#x1f485; 想寻找共同学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼小组】&#x1f4ac; 免费且实用的计算机…

截长图方法

有的时候&#xff0c;我们可能需要截一个网站或者一些内容的图片&#xff0c;但屏幕不够大&#xff0c;出现滚动条&#xff0c;这时候我们就可以使用截长图的方法来达到截取整个网页的内容。 截长图方法有很多&#xff0c;以下介绍两种我所知道的截长图方法。 第一种方法&…

html5中框架怎么写,HTML5常用框架

HTML5常用框架 前言 随着HTML5规范的不断完善&#xff0c;围绕着这一生态有很多实用的框架&#xff0c;极大的提高了我们的开发效率&#xff0c;常见的框架代表有&#xff1a;UI层面的有Bootstrap、Yui、JqueryUI、CSS3Lib等&#xff0c;JS层面的有JQuery、Zeptojs、Angularjs、…