folly学习心得(转)
1) 编译安装;
2) 学习doc/manual文档;
3) 学习test用例;
4) 测试并使用。
folly库的学习心得
独立有用的小技巧
Eventfd.h ---- 针对eventfd系统调用的包装器。
Foreach.h ---- 伪语句(作为宏语句来实现),用于迭代。
IntrusiveList.h --- 方便类型定义,用于使用boost::intrusive_list(不知道干什么的)。
Likely.h ---- 针对__builtin_expect的包装器。分支预测编译加速。
Malloc.h ---- 内存分配助手,尤其是使用jemalloc时。
MapUtil.h ---- 用于查找联合容器的小工具,找不到返回默认值。(比如std::map和std::unordered_map)。
Preprocessor.h ---- 获取可变参数的第1个或第2个参数,用于模板编程!Synchronized.h的实现就靠这个!
ScopeGuard.h ---- Basically, it guarantees that a function is executed upon leaving the currrent scope unless otherwise told. 即确保资源能够被正确析构(调用资源析构函数)。
StlAllocator.h ---- STL分配器,包装简单的分配/取消分配接口。貌似为了低版本gcc。
Traits.h ---- 类型特性。用于判断类型是否可直接内存拷贝(可重定位的对象)。C++假定所有的对象都是“non-relocatable values”(需要调用构造函数而不能直接拷贝内存数据)。实际中,很多C++对象可通过直接拷贝内存数据完成对象"再造"!(Relocatable object/type -- 可重定位的对象/类型)。Traits.h的核心就是提供"可重定位的类型"编译时判断工具。FBvector的核心优化之一:利用memcpy/memmove来处理"可重定位的类型"!
C++功能增强和扩展
FBString.h ---- std::string性能优化版本。
FBvector.h ---- std::vector性能优化版本。
Bits.h ---- 各种位处理实用组件,针对速度而优化。
Conv.h ---- 各种数据转换例程(尤其是to和from字符串),针对速度和安全进行了优化。
DiscriminatedPtr.h ---- 类似boost::variant,但完全局限于指针。使用指针中最高位、未使用的16位作为鉴别器。所以sizeof(DiscriminatedPtr<int, string, Widget>) == sizeof(void*)。
Dynamic.h ---- 动态类型对象,类似boost::variant。用于json.h。
Format.h ---- Python式样的格式化实用组件。C++功能增强和扩展的集大成者,基本上用到了上述的各个头文件!
Range.h ---- 类Boost的随机访问数据包装类,针对StringPiece的定制版本。
String.h ---- 非常有用的string工具集合:std::string <=> FBstring 互转工具、C风格转义字符串工具(反转工具)、stringPrintf工具、prettyPrint(支持时间、容量等常见单位)、hexDump工具、errnoStr\exceptionStr、demangle(串化C++类型)、split(分拆字符串)。
Unicode.h ---- 定义了codePointToUtf8函数。实现unicode码点到utf-8编码的转换。
简化多线程编程
Arena.h,ThreadCachedArena.h ---- 内存分配的简单地方:多次内存分配同时被释放。使用线程版本。简化内存管理,相当于java的gc(垃圾回收机制)。
AtomicHashMap.h,AtomicHashArray.h ---- 高性能的原子哈希图,采用几乎无锁的操作。
ProducerConsumerQueue.h ---- 单生产者单消费者队列。
SmallLocks.h ---- 非常小的旋转锁(1字节和1位)。
Synchronized.h ---- 提供一种非常好的多线程同步编码范式!!!请直接看doc和测试代码!
ThreadLocal.h ---- 改进的线程本地存储,用于存储非内置类型。取代pthread_key_t。
ThreadCachedInt.h ---- 使用线程缓存的高性能原子增量。
独立组件
Hash.h ---- 各种流行的哈希函数实现。
GroupVarint.h ---- 针对32位值的Group Varint编码。
Histogram.h ---- 用于收集直方图数据。
Json.h ---- JSON序列化器和反序列化器。使用dynamic.h。
Random.h ---- 只定义了一个函数:randomNumberSeed()。使用当前时间和PID来产生随机数种子。
TimeoutQueue.h ---- 定时器队列。按项目设定超时的队列。
就是为了性能
PackedSyncPtr.h ---- 一种高度专业化的数据结构,含有指针、1位旋转锁和15位整数,它们都在一个64位整型数中。目标:节约空间(当前64位机的指针高16位未用)。用到SmallLocks。
RWSpinLock.h ---- 快速而紧凑的读取器/写入器旋转锁。
small_vector.h ---- 含有小缓冲器方面的优化vector,策略可选:NoHeap、OneBitMutex。
sorted_vector_types.h ---- 类似std::map的集合体,但是作为排序向量来实现。适用:数量少。目的:节约空间。
总结
folly最大的不足就是需要C++11的新特性,需要gcc4.6以上的编译器方能使用。若是从学习的角度去看,folly有很多小技巧可学习;若从实用的角度看,folly能够极大地方便多线程编程;若从性能角度看,folly对不少C++功能做了增强和扩展。总之,folly是一个很不错的C++库。就冲着Andrei Alexandrescu的大名也看学习学习。不过从实际工作中看,就不要指望folly能够大大降低工作量了 ^_^。
参考
folly自带的doc和源码
揭秘Facebook官方底层C++函数Folly(docs/Overview.md翻译)
folly学习心得(转)的更多相关文章
- 我的MYSQL学习心得(一) 简单语法
我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...
- 我的MYSQL学习心得(二) 数据类型宽度
我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...
- 我的MYSQL学习心得(三) 查看字段长度
我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...
- 我的MYSQL学习心得(四) 数据类型
我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(五) 运 ...
- 我的MYSQL学习心得(五) 运算符
我的MYSQL学习心得(五) 运算符 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...
- 我的MYSQL学习心得(六) 函数
我的MYSQL学习心得(六) 函数 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类 ...
- 我的MYSQL学习心得(七) 查询
我的MYSQL学习心得(七) 查询 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类 ...
- 我的MYSQL学习心得(八) 插入 更新 删除
我的MYSQL学习心得(八) 插入 更新 删除 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得( ...
- 我的MYSQL学习心得(九) 索引
我的MYSQL学习心得(九) 索引 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类 ...
随机推荐
- 【跟着stackoverflow学Pandas】Select rows from a DataFrame based on values in a column -pandas 筛选
最近做一个系列博客,跟着stackoverflow学Pandas. 以 pandas作为关键词,在stackoverflow中进行搜索,随后安照 votes 数目进行排序: https://stack ...
- 使用kibana来进行ElasticSearch的信息查询检索
大家经常会听到使用ELK搭建日志管理平台.完成日志聚合检索的功能,那么这个平台到底是个什么概念,怎么搭建,怎么使用呢? ELK包括ElasticSearch(数据存储.快速查询).logstash(日 ...
- Bandit:一种简单而强大的在线学习算法
假设我有5枚硬币,都是正反面不均匀的.我们玩一个游戏,每次你可以选择其中一枚硬币掷出,如果掷出正面,你将得到一百块奖励.掷硬币的次数有限(比如10000次),显然,如果要拿到最多的利益,你要做的就是尽 ...
- js之隔行换色
HTML <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <ti ...
- BZOJ4292 PA2015 Równanie 【暴力水题】
BZOJ4292 PA2015 Równanie Description 对于一个正整数n,定义f(n)为它十进制下每一位数字的平方的和.现在给定三个正整数k,a,b,请求出满足a<=n< ...
- tableau-交互筛选器
欢迎观看这段关于“交互筛选器”的视频. 将字段拖到筛选器功能区就可以轻松执行筛选,但是如果我们希望能够直接从视图中修改筛选器 选择项,那该怎么办?如果我们在可看到“子类别”字段的任何位置右键单击, ...
- 理解 C# 项目 csproj 文件格式的本质和编译流程
写了这么多个 C# 项目,是否对项目文件 csproj 有一些了解呢?Visual Studio 是怎么让 csproj 中的内容正确显示出来的呢?更深入的,我能够自己扩展 csproj 的功能吗? ...
- Python编码规范和Python风格规范
一.原因 1.长期的工作中,发现大多数程序员的代码可读性差 2.不同的程序员之间的协作很重要,代码可读性必须很好 3.版本升级时,要基于源码升级 4.不友好的代码会影响python的执行效率 二.基于 ...
- altium布局布线原则
布局应该先放位置确定不能随意变动的,之后是核心器件,然后是周围器件,如果周围器件过多,为防止布线时交叉过多,可以一部分小模块放到底层. 布线时优先顺序为先电源线和网络中使用频率高的线,之后是信号线.走 ...
- normalizr api 转换类库使用
1. 项目初始化 yarn init yarn add normalizr 项目结构 app.js package.json user.json 2. 使用 a. app.js const userj ...