1) 編譯安裝;
2) 學習doc/manual文檔;
3) 學習test用例;
4) 測試並使用。html
folly庫的學習心得
獨立有用的小技巧
Eventfd.h ---- 針對eventfd系統調用的包裝器。java
Foreach.h ---- 僞語句(做爲宏語句來實現),用於迭代。編程
IntrusiveList.h --- 方便類型定義,用於使用boost::intrusive_list(不知道幹什麼的)。json
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。less
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翻譯)