folly 之 fbstring

folly

folly 是 facebook 开源的一个 c++ 基础库, 主打性能, 对 boost 或是 stl 的补充。
folly 是基于 c++11 的, 大量采用现代 c++ 的特性, 是学习现代 c++ 编程的一份很好
的素材。

fbstring

fbstring 是 std::string 的一个替代品, 它们的接口是完全兼容的。而且提供了接口在
std::string 和 fbstring 间进行转换。fbstring 的最大卖点就是速度快。

fbstring 优化点

分层存储

fbstring 对于字符串的大小, 分成 3 种方式来分配和使用内存

  1. 小于 23(包括 23)

    直接放在 fbstring 内, 不额外分配内存, 对于大量使用小字符串的情景下, 这个优化
    是相当有用的, 字符串甚至可以直接在棧上, 非常的环保。
    
  2. 24 到 255(包括 255)
    直接采用 malloc 分配内存, 字符串拷贝也会直接拷贝
    
  3. 大于 255
    考虑到大字符串拷贝消耗比较大, 所以只有在需要的时候才会做真正的拷贝, 实现的方法
    是引用计数和 copy-on-write。
    

数据结构

struct MediumLarge {
  Char * data_;
  size_t size_;
  size_t capacity_;

union {
  uint8_t bytes_[sizeof(MediumLarge)]; // For accessing the last byte.
  Char small_[sizeof(MediumLarge) / sizeof(Char)];
  MediumLarge ml_;
};

联合结构中的 bytes_ 是为了获取最后一个字节用的,最后一个字节里存储了字符串的类型,
不同的类型会有不同的操作。对于 small 的字符串,它的总的大小是 24 字节,这其中包
含了字符串数据,包含一个字符串结束'\0',以及字符串的大小。但是 fbstring 可以存储
23 个字节(不包含字符串结束符),比 24 个字节只少了一个字节,我们来看看它是怎么
做到的。最后一个字节存储了字符串的类型,因为只有 3 种字符串类型,所以只需要 2 位
就够了,还剩下 6 位,这 6 位存储的不是字符串的长度,而是还有多少 可用剩余空间
,在字符串需要变大的时候,就可以直接用这个值来判断是否需要转换成 media 类型的字
符串,但是在取 size 的时候,需要简单计算一下,当 small 字符串长度小于 23 个字符
的时候,可以在字符串的末尾直接加上'\0',作为结束符。当字符内串达到 23 个字节的时
候,最后一个字节记录的 可用剩余空间 就变成了 0(最后一个字节的 6 位),又因为
small 类型的字符串的类型值正好是 0(最后一个字节的 2 位), 所以最后一个字节就是
0,这也正好充当了字符串的结束符。

find 优化

字符串的 find 操作使用了 Boyer Moore 算法来加速, 相对于 std::string 在查找命中
和非命中的情况下都有很大的提高,我随便找了两个字符串测试了一下,大概有 2-3 倍的提高

时间: 2024-10-08 00:14:30

folly 之 fbstring的相关文章

Facebook 的 C++ 11 组件库 Folly Futures

Futures 是一种通过自然的.可组合的方式表达异步计算的模式.这篇博文介绍了我们在 Facebook 中使用的一种适用于 C++11 的 futures 实现:Folly Futures. 为什么要使用异步? 想象一个服务 A 正在与服务 B 交互的场景.如果 A 被锁定到 B 回复后才能继续进行其他操作,则 A 是同步的.此时 A 所在的线程是空闲的,它不能为其他的请求提供服务.线程会变得非常笨重-切换线程是低效的,因为这需要耗费可观的内存,如果你进行了大量这样的操作,操作系统会因此陷入困

windows上搭建react native环境

一.配置环境 1.准备相关资源  AndroidStudio Android开发集成开发环境(推荐下载含SDK tools版)  JDK for Windows Java Develop Kit(java开发工具)  Nodejs nodejs环境 2.ReactNative环境配置步骤  1) 使用npm安装ReactNative 在cmd命令工具中执行以下命令,注意并非 install react-native,装了react-native在后面init项目的时候会报错,需要卸掉再重装. 1

J2SE 5.0的新特性---Autoboxing

j2se AutoboxingAs any Java programmer knows, you can't put an int (or other primitive value) into a collection. Collections can only hold object references, so you have to box primitive values into the appropriate wrapper class (which is Integer in t

正则表达式教程 - dreamweaver官方资料

教程|正则|dreamweaver 正则表达式 正则表达式是以文本描述字符组合的模式.在代码搜索中使用它们有助于描述一些概念,例如以"以'var'开始的行"和"包含数字的属性值".有关搜索的更多信息,请参见搜索和替换标签和属性. 下表列出了在正则表达式中使用的特殊字符.其含义和用法示例.若要搜索包含该表中某一特殊字符的文本,请在特殊字符前面附加一个反斜杠,令其"转义".例如,若要在 some conditions apply* 短语中搜索实际的星

Dreamweaver正则表达式教程

正则表达式是以文本描述字符组合的模式.在代码搜索中使用它们有助于描述一些概念,例如以"以'var'开始的行"和"包含数字的属性值".有关搜索的更多信息,请参见搜索和替换标签和属性. 下表列出了在正则表达式中使用的特殊字符.其含义和用法示例.若要搜索包含该表中某一特殊字符的文本,请在特殊字符前面附加一个反斜杠,令其 "转义".例如,若要在 短语中搜索实际的星号,您的搜索模式应类似于:apply*.如果您没有令星号转义,您将找到"apply

值得推荐的开源C/C++框架和库

值得学习的C语言开源项目   - 1. Webbench Webbench是一个在linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能,最多可以模拟3万个并发连接去测试网站的负载能力.Webbench使用C语言编写, 代码实在太简洁,源码加起来不到600行. 下载链接:http://home.tiscali.cz/~cz210552/webbench.html - 2. Tinyhttpd tinyhttpd是一个超轻量型

值得推荐的C/C++框架和库

下次造轮子前先看看现有的轮子吧   值得学习的C语言开源项目 - 1. Webbench  Webbench是一个在linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能,最多可以模拟3万个并发连接去测试网站的负载能力.Webbench使用C语言编写, 代码实在太简洁,源码加起来不到600行. 下载链接:http://home.tiscali.cz/~cz210552/webbench.html - 2. Tinyhttpd

【干货】国外程序员整理的 C++ 资源大全

 关于 C++ 框架.库和资源的一些汇总列表,由 fffaraz发起和维护. 内容包括:标准库.Web应用框架.人工智能.数据库.图片处理.机器学习.日志.代码分析等. 标准库 C++ Standard Library:是一系列类和函数的集合,使用核心语言编写,也是C++ISO自身标准的一部分. Standard Template Library:标准模板库 C POSIX library : POSIX系统的C标准库规范 ISO C++ Standards Committee :C++标准

站在巨人的肩膀上,C++开源库大全

程序员要站在巨人的肩膀上,C++拥有丰富的开源库,这里包括:标准库.Web应用框架.人工智能.数据库.图片处理.机器学习.日志.代码分析等.   标准库 C++ Standard Library:是一系列类和函数的集合,使用核心语言编写,也是C++ISO自身标准的一部分. Standard Template Library:标准模板库 C POSIX library : POSIX系统的C标准库规范 ISO C++ Standards Committee :C++标准委员会 框架 C++通用框架