Facebook folly代碼庫(kù)學(xué)習(xí)心得
學(xué)習(xí)代碼庫(kù)的一般步驟
1) 編譯安裝;
2) 學(xué)習(xí)doc/manual文檔;
3) 學(xué)習(xí)test用例;
4) 測(cè)試并使用。
folly庫(kù)的學(xué)習(xí)心得
獨(dú)立有用的小技巧
Eventfd.h ---- 針對(duì)eventfd系統(tǒng)調(diào)用的包裝器。
Foreach.h ---- 偽語(yǔ)句(作為宏語(yǔ)句來(lái)實(shí)現(xiàn)),用于迭代。
IntrusiveList.h --- 方便類(lèi)型定義,用于使用boost::intrusive_list(不知道干什么的)。
Likely.h ---- 針對(duì)__builtin_expect的包裝器。分支預(yù)測(cè)編譯加速。
Malloc.h ---- 內(nèi)存分配助手,尤其是使用jemalloc時(shí)。
MapUtil.h ---- 用于查找聯(lián)合容器的小工具,找不到返回默認(rèn)值。(比如std::map和std::unordered_map)。
Preprocessor.h ---- 獲取可變參數(shù)的第1個(gè)或第2個(gè)參數(shù),用于模板編程!Synchronized.h的實(shí)現(xiàn)就靠這個(gè)!
ScopeGuard.h ---- Basically, it guarantees that a function is executed upon leaving the currrent scope unless otherwise told. 即確保資源能夠被正確析構(gòu)(調(diào)用資源析構(gòu)函數(shù))。
StlAllocator.h ---- STL分配器,包裝簡(jiǎn)單的分配/取消分配接口。貌似為了低版本gcc。
Traits.h ---- 類(lèi)型特性。用于判斷類(lèi)型是否可直接內(nèi)存拷貝(可重定位的對(duì)象)。C++假定所有的對(duì)象都是“non-relocatable values”(需要調(diào)用構(gòu)造函數(shù)而不能直接拷貝內(nèi)存數(shù)據(jù))。實(shí)際中,很多C++對(duì)象可通過(guò)直接拷貝內(nèi)存數(shù)據(jù)完成對(duì)象"再造"!(Relocatable object/type -- 可重定位的對(duì)象/類(lèi)型)。Traits.h的核心就是提供"可重定位的類(lèi)型"編譯時(shí)判斷工具。FBvector的核心優(yōu)化之一:利用memcpy/memmove來(lái)處理"可重定位的類(lèi)型"!
C++功能增強(qiáng)和擴(kuò)展
FBString.h ---- std::string性能優(yōu)化版本。
FBvector.h ---- std::vector性能優(yōu)化版本。
Bits.h ---- 各種位處理實(shí)用組件,針對(duì)速度而優(yōu)化。
Conv.h ---- 各種數(shù)據(jù)轉(zhuǎn)換例程(尤其是to和from字符串),針對(duì)速度和安全進(jìn)行了優(yōu)化。
DiscriminatedPtr.h ---- 類(lèi)似boost::variant,但完全局限于指針。使用指針中***位、未使用的16位作為鑒別器。所以sizeof(DiscriminatedPtr<int, string, Widget>) == sizeof(void*)。
Dynamic.h ---- 動(dòng)態(tài)類(lèi)型對(duì)象,類(lèi)似boost::variant。用于json.h。
Format.h ---- Python式樣的格式化實(shí)用組件。C++功能增強(qiáng)和擴(kuò)展的集大成者,基本上用到了上述的各個(gè)頭文件!
Range.h ---- 類(lèi)Boost的隨機(jī)訪(fǎng)問(wèn)數(shù)據(jù)包裝類(lèi),針對(duì)StringPiece的定制版本。
String.h ---- 非常有用的string工具集合:std::string <=> FBstring 互轉(zhuǎn)工具、C風(fēng)格轉(zhuǎn)義字符串工具(反轉(zhuǎn)工具)、stringPrintf工具、prettyPrint(支持時(shí)間、容量等常見(jiàn)單位)、hexDump工具、errnoStr\exceptionStr、demangle(串化C++類(lèi)型)、split(分拆字符串)。
Unicode.h ---- 定義了codePointToUtf8函數(shù)。實(shí)現(xiàn)unicode碼點(diǎn)到utf-8編碼的轉(zhuǎn)換。
簡(jiǎn)化多線(xiàn)程編程
Arena.h,ThreadCachedArena.h ---- 內(nèi)存分配的簡(jiǎn)單地方:多次內(nèi)存分配同時(shí)被釋放。使用線(xiàn)程版本。簡(jiǎn)化內(nèi)存管理,相當(dāng)于java的gc(垃圾回收機(jī)制)。
AtomicHashMap.h,AtomicHashArray.h ---- 高性能的原子哈希圖,采用幾乎無(wú)鎖的操作。
ProducerConsumerQueue.h ---- 單生產(chǎn)者單消費(fèi)者隊(duì)列。
SmallLocks.h ---- 非常小的旋轉(zhuǎn)鎖(1字節(jié)和1位)。
Synchronized.h ---- 提供一種非常好的多線(xiàn)程同步編碼范式?。。≌?qǐng)直接看doc和測(cè)試代碼!
ThreadLocal.h ---- 改進(jìn)的線(xiàn)程本地存儲(chǔ),用于存儲(chǔ)非內(nèi)置類(lèi)型。取代pthread_key_t。
ThreadCachedInt.h ---- 使用線(xiàn)程緩存的高性能原子增量。
獨(dú)立組件
Hash.h ---- 各種流行的哈希函數(shù)實(shí)現(xiàn)。
GroupVarint.h ---- 針對(duì)32位值的Group Varint編碼。
Histogram.h ---- 用于收集直方圖數(shù)據(jù)。
Json.h ---- JSON序列化器和反序列化器。使用dynamic.h。
Random.h ---- 只定義了一個(gè)函數(shù):randomNumberSeed()。使用當(dāng)前時(shí)間和PID來(lái)產(chǎn)生隨機(jī)數(shù)種子。
TimeoutQueue.h ---- 定時(shí)器隊(duì)列。按項(xiàng)目設(shè)定超時(shí)的隊(duì)列。
就是為了性能
PackedSyncPtr.h ---- 一種高度專(zhuān)業(yè)化的數(shù)據(jù)結(jié)構(gòu),含有指針、1位旋轉(zhuǎn)鎖和15位整數(shù),它們都在一個(gè)64位整型數(shù)中。目標(biāo):節(jié)約空間(當(dāng)前64位機(jī)的指針高16位未用)。用到SmallLocks。
RWSpinLock.h ---- 快速而緊湊的讀取器/寫(xiě)入器旋轉(zhuǎn)鎖。
small_vector.h ---- 含有小緩沖器方面的優(yōu)化vector,策略可選:NoHeap、OneBitMutex。
sorted_vector_types.h ---- 類(lèi)似std::map的集合體,但是作為排序向量來(lái)實(shí)現(xiàn)。適用:數(shù)量少。目的:節(jié)約空間。
總結(jié)
folly***的不足就是需要C++11的新特性,需要gcc4.6以上的編譯器方能使用。若是從學(xué)習(xí)的角度去看,folly有很多小技巧可學(xué)習(xí);若從實(shí)用的角度看,folly能夠極大地方便多線(xiàn)程編程;若從性能角度看,folly對(duì)不少C++功能做了增強(qiáng)和擴(kuò)展。總之,folly是一個(gè)很不錯(cuò)的C++庫(kù)。就沖著Andrei Alexandrescu的大名也看學(xué)習(xí)學(xué)習(xí)。不過(guò)從實(shí)際工作中看,就不要指望folly能夠大大降低工作量了 ^_^。
olly自帶的doc和源碼
揭秘Facebook官方底層C++函數(shù)Folly(docs/Overview.md翻譯)
原文鏈接:http://www.cnblogs.com/zhenjing/archive/2012/06/27/folly_research.html
【編輯推薦】