阅读目录

 
学习代码库的一般步骤

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学习心得(转)的更多相关文章

  1. 我的MYSQL学习心得(一) 简单语法

    我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  2. 我的MYSQL学习心得(二) 数据类型宽度

    我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  3. 我的MYSQL学习心得(三) 查看字段长度

    我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  4. 我的MYSQL学习心得(四) 数据类型

    我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(五) 运 ...

  5. 我的MYSQL学习心得(五) 运算符

    我的MYSQL学习心得(五) 运算符 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...

  6. 我的MYSQL学习心得(六) 函数

    我的MYSQL学习心得(六) 函数 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类 ...

  7. 我的MYSQL学习心得(七) 查询

    我的MYSQL学习心得(七) 查询 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类 ...

  8. 我的MYSQL学习心得(八) 插入 更新 删除

    我的MYSQL学习心得(八) 插入 更新 删除 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得( ...

  9. 我的MYSQL学习心得(九) 索引

    我的MYSQL学习心得(九) 索引 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类 ...

随机推荐

  1. cookies分类

    Cookie总是保存在客户端中,按在客户端中的存储位置,可分为内存Cookie和硬盘Cookie. 内存Cookie由浏览器维护,保存在内存中,浏览器关闭后就消失了,其存在时间是短暂的.硬盘Cooki ...

  2. CUDA Samples: heat conduction(模拟热传导)

    以下CUDA sample是分别用C++和CUDA实现的模拟热传导生成的图像,并对其中使用到的CUDA函数进行了解说,code参考了<GPU高性能编程CUDA实战>一书的第七章,各个文件内 ...

  3. angular 中不要使用location.href

    location.href = '#/HKorderList?gid='+gid+'&gname='+encodeURIComponent(gname)+'&cPeriod='+$(' ...

  4. Python matplotlib 数据分布

    利用plt.hist() import matplotlib.pylab as plt %matplotlib inline plt.figure(figsize=(21, 12)) plt.hist ...

  5. JS修改标签中的文本且不影响其中标签

    /********************************************************************* * JS修改标签中的文本且不影响其中标签 * 说明: * ...

  6. Adobe Flash Builder 4.6 Premium 安装破解

    1.到Adobe官网下载FlashBuilder 4.6,有简体中文版: 语言:简体中文(Simplified)http://trials3.adobe.com/AdobeProducts/FLBR/ ...

  7. BZOJ4373 算术天才⑨与等差数列 【线段树】*

    BZOJ4373 算术天才⑨与等差数列 Description 算术天才⑨非常喜欢和等差数列玩耍. 有一天,他给了你一个长度为n的序列,其中第i个数为a[i]. 他想考考你,每次他会给出询问l,r,k ...

  8. Roslyn 入门:使用 Roslyn 静态分析现有项目中的代码

    Roslyn 是微软为 C# 设计的一套分析器,它具有很强的扩展性.以至于我们只需要编写很少量的代码便能够分析我们的项目文件. 作为 Roslyn 入门篇文章,你将可以通过本文学习如何开始编写一个 R ...

  9. 剑指offer第七章&第八章

    剑指offer第七章&第八章 1.把字符串转换成整数 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一个合法的数值则返回0 输入描述: 输入一个字符串 ...

  10. FirstTry_HelloWorld

    #include <qapplication.h> #include <qpushbutton.h> int main( int argc, char **argv ) { Q ...