阅读目录

 
学习代码库的一般步骤

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. 我的第一个React自定义组件

    今天随便翻了一下antd的组件库,看到下面这样的组件,当时我就震惊了: 这尼玛,这是出于什么样的考虑,一个列表还要用户编写子项的渲染方式. 所以,我就自己写了一个 List.js: List.less ...

  2. 一段处理json的C#代码

    服务器端: using Newtonsoft.Json; using Newtonsoft.Json.Linq; public ActionResult GetGatherData() { IList ...

  3. ROS机器人操作系统官方教程、源码汇总

    1 wiki: http://wiki.ros.org/  2 code: https://github.com/ ---- 1 基础教程 https://github.com/ros/ros_tut ...

  4. iOS开发之如何在Xcode中显示断点堆栈

    昨天有人问我在Xcode中打断点后怎么查看堆栈,今天就简单的聊聊. 首先解释一下,什么是堆栈? 堆:顺序随意:栈区(stack)- 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式 ...

  5. Js/Jquery获取网页屏幕可见区域高度

    获取浏览器窗口的可视区域高度和宽度,滚动条高度有需要的朋友可参考一下. 1 document.body.clientWidth ==> BODY对象宽度 2 document.body.clie ...

  6. python 函数返回多个值

    参考文献:http://blog.csdn.net/facevoid/article/details/5369146

  7. my_itoa

    #include <iostream> using namespace std; char *my_reverse(char* s) { char *p,*q; p=s;q=s; whil ...

  8. erl_0017 《硝烟中的erlang》 读书笔记004 “锁和阻塞”

    如果某个进程需要持续地接收新任务,那么其在执行耗时过长的锁或者阻塞操作时,就会出现问题. 最为常见的例子之一就是:某个进程使用了TCP socket,阻塞在了接收新的连接或者等待消息上面.在执行此类阻 ...

  9. BZOJ5301: [Cqoi2018]异或序列(莫队)

    5301: [Cqoi2018]异或序列 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 400  Solved: 291[Submit][Status ...

  10. 命令“"xxx.exe" xxx”已退出,代码为 n。这些错误是什么意思?(3 / 123 / 9009)

    命令“”xxx.exe” xxx”已退出,代码为 n. 我们在 cmd 中输入常见命令的时候,如果命令输入错误或使用错误,cmd 中会提示错误原因,帮助我们定位并解决问题.然而如果相同的命令放到了 V ...