【AICon】AI 大模型超全落地场景&最佳实践 了解详情
写点什么

FBString 分析与使用

  • 2019-11-24
  • 本文字数:1164 字

    阅读完需:约 4 分钟

FBString分析与使用

8 月 16 - 19 日,与零一万物李开复、蔚来李斌、面壁智能李大海,及工商银行、交通银行、华夏银行等 100+ 行业专家相聚 FCon x AICon

FBString 基本上用到了所有常见的实现 String 的方法,具有一定的学习和参考价值。但很多小伙伴都不了解 FBSting,希望通过本文能够帮助大家了解它、更好的运用它。

FBString 简介

fbstring is a drop-in replacement for std::string. The main benefit of fbstring is significantly increased performance on virtually all important primitives. This is achieved by using a three-tiered storage strategy and by cooperating with the memory allocator. In particular, fbstring is designed to detect use of jemalloc and cooperate with it to achieve significant improvements in speed and memory usage.


简单来说,使用了三层存储策略+内存分配策略+大小端支持,特别是配合使用 jemalloc, 减少磁盘碎片,加快并发下的分配速度和性能。

存储策略

SSO 技术

使用栈上缓冲区,存储字符不超过 23 个,存储在类的数组类型的成员变量中;

Eager Copy 技术

存储字符不超过 254 个,总是存储在 malloc 分配的堆上内存空间;

Copy-On-Write 技术

存储字符超过 254, 使用 COW 技术,引入引用计数,避免不必要的 copy 操作。

核心实现

1 fbstring_core

fbstring_core 是 FBString 的实现核心,提供了全部的操作接口,实现了三层存储策略+内存分配策略+大小端支持;


用户可根据需要实现自己的 fbstring_core_model(即 fbstring_core 的 mockup 接口定义)接口,即实现了自己的 String 类;


可以用状态机的思路来理解 fbstring_core, 按存储策略的不同其当前可能处于三种不同的状态:


small, medium, large, 当构造,赋值,扩容,收缩等操作发生时,会在这三种状态间转换,即其存储策略也会相应主调整,大部分函数都按这个思路来阅读吧;


category() 可获取当前的状态:small, medium, large,下面我们会经常提到这三种状态;


数据成员



使用了 union,其中 small_用于 small 状态时的字符串存储,MediumLarge 用于 medium 和 large 状态时的字符串存储;


使用 small_时,其最后一格存储 maxSmallSize - 当前字符串实现大小


这个看起来还是一目了然,很清楚的。


RefCounted



看着代码多,其实很简单。


在 large 状态使用 COW 技术就需要引用计数的存在,这个 RefCounted 就实现了这个,利用了 std::atomic 作计数,data_指向需要作计数的实体。fromData(Char p)*函数从需作计数的实体指针得到其对应的 RefCounted 实体的指针。

构造函数

基本上都是按三种状态对应的策略来构造


Move constructor


交换函数

void swap(fbstring_core & rhs)auto const t = ml_;ml_ = rhs.ml_;rhs.ml_ = t;
复制代码



相关文章:


http://en.cppreference.com/w/cpp/atomic/atomic


http://en.cppreference.com/w/cpp/language/move_constructor


本文转载自公众号 360 云计算(ID:hulktalk)。


原文链接:


https://mp.weixin.qq.com/s/8enQzKInxVfYA8oW51LcXg


2019-11-24 19:45626

评论

发布
暂无评论
发现更多内容

常见的中文电脑输入法软件有哪些?

InfoQ IT百科

低代码让人人都是开发者,高校人才有了努力的新方向

一只大光圈

阿里 低代码 数字化 钉钉宜搭 浙江工商大学

怎么清理钉钉缓存的图片和文件?

InfoQ IT百科

开源规则引擎——ice:致力于解决灵活繁复的硬编码问题

声网

开源 规则引擎 Dev for Dev

有哪些好用的杀毒软件?

InfoQ IT百科

Chrome如何安装插件?

InfoQ IT百科

React Hooks 的实现必须依赖 Fiber 么?

云智慧AIOps社区

前端 大前端 React Hooks preact

在 Amazon QuickSight 中使用 Athena 数据连接器可视化 DynamoDB 数据

亚马逊云科技 (Amazon Web Services)

DevOps 亚马逊云科技 career tutorial

如何将PDF转换成Word?

InfoQ IT百科

如何认证成为亚马逊云科技 DevOps 专家?

亚马逊云科技 (Amazon Web Services)

DevOps 亚马逊云科技 tutorial caree

如何给电脑文件夹设置密码?

InfoQ IT百科

如何共享电脑上的文件?

InfoQ IT百科

下载软件哪个好?

InfoQ IT百科

深度学习—人工智能的第三次热潮

云智慧AIOps社区

人工智能 机器学习 深度学习

如何用Excel画图?

InfoQ IT百科

TASKCTL 应用工程与作业类型的定义

敏捷调度TASKCTL

DevOps 敏捷开发 批量任务 ETL系统 自动化运维

如何清除WinRAR压缩文件历史记录?

InfoQ IT百科

md文件要用什么软件打开?

InfoQ IT百科

银行App为什么都不怎么好用?

InfoQ IT百科

浅识鸿蒙的Java技术栈

Bob

Excel表格中怎么防止重复录入数据?

InfoQ IT百科

如何批量导出PPT里的图片?

InfoQ IT百科

APP访问用户的通讯录后,会得到通讯录上的信息吗?

InfoQ IT百科

电脑上切换输入法的快捷键是什么?

InfoQ IT百科

Chrome如何启用隐身模式?

InfoQ IT百科

如何对APP进行数据分析?

InfoQ IT百科

APP、小程序、H5,如何选择不同的开发载体?

InfoQ IT百科

深入浅出 Zookeeper 中的 ZAB 协议

悟空聊架构

zookeeper ZAB 4月日更 悟空聊架构 4月月更

如何用WinRAR将大文件分割成多个小文件?

InfoQ IT百科

如何在APP原型上写需求?

InfoQ IT百科

抖音获客源码,蓝V思域运营,大热的X-Gorgon 0408和8408算法,今年的SaaS源码,编程语言需要变革吗?

yunluohd168

抖音短视频获客系统 抖音获客源码

FBString分析与使用_文化 & 方法_刘伟_InfoQ精选文章