揭秘Facebook官方底層C++函數(shù)Folly
譯文【51CTO經(jīng)典譯文】Folly與Boost、當(dāng)然還有std等組件庫的關(guān)系是互為補(bǔ)充,而不是彼此競爭。實(shí)際上,只有當(dāng)我們需要的東西既沒有,也無法滿足所需的性能要求時,我們才開始定義自己的組件。
性能問題貫穿著Folly的大部分,有時導(dǎo)致比較具有特質(zhì)性的設(shè)計(比如PackedSyncPtr.h和SmallLocks.h)。整體上確保良好的性能是所有Folly的統(tǒng)一主題。
邏輯設(shè)計
Folly是一組相對獨(dú)立的組件的集合體,有些組件就是幾個符號這么簡單。內(nèi)部依賴方面沒有限制,這意味著某個特定的folly模塊可以使用其他任何的folly組件。
所有符號都在頂層的命名空間folly中加以定義,當(dāng)然除了宏。宏名稱是ALL_UPPERCASE。命名空間folly定義了其他的內(nèi)部命名空間,比如internal或detail。用戶代碼應(yīng)該不依賴那些命名空間中的符號。
物理設(shè)計
在頂層,F(xiàn)olly采用經(jīng)典的“結(jié)巴”(stuttering)方案folly/folly,這也是Boost及其他組件庫所采用的。***個目錄充當(dāng)庫的安裝根目錄(可能是以folly-1.0/這樣的形式);第二個目錄是添加文件時用來辨別組件庫,比如#include "folly/FBString.h"。
目錄結(jié)構(gòu)是扁平的(模仿命名空間結(jié)構(gòu)),也就是說我們沒有復(fù)雜的目錄層次結(jié)構(gòu)(這個情況在將來的版本中可能會有變化)。子目錄experimental含有在folly里面使用的文件,可能用在Facebook端,但是被認(rèn)為不夠穩(wěn)定,無法在客戶端使用。你的代碼不該使用folly/experimental中的文件,以免你在更新Folly時,出現(xiàn)問題。
folly/folly/test子目錄包括了面向所有組件的單元測試,通常名為ComponentXyzTest.cpp,面向每個ComponentXyz.*。folly/folly/docs目錄含有說明文檔。
兼容性
目前,folly已在64位安裝版Fedora 17、Ubuntu 12.04和Debian wheezy的gcc 4.6上進(jìn)行了測試。它不用改動,就可以在其他64位Linux平臺上運(yùn)行。
組件
下面按字母順序介紹了一系列Folly組件,另外附有每個組件的簡短描述。
Arena.h,ThreadCachedArena.h
內(nèi)存分配的簡單地方:多次內(nèi)存分配同時被釋放。使用線程版本。
AtomicHashMap.h,AtomicHashArray.h
高性能的原子哈希圖,采用幾乎無鎖的操作。
Benchmark.h
用于代碼基準(zhǔn)測試的小型框架。客戶端代碼注冊基準(zhǔn)測試,可選情況下使用一個變量來規(guī)定基準(zhǔn)測試的范圍(迭代和工作集大小等)。框架運(yùn)行基準(zhǔn)測試(受制于命令行標(biāo)記),生成帶計時信息的格式化輸出。
Bits.h
各種位處理實(shí)用組件,針對速度而優(yōu)化。
Bits.h
位變換函數(shù),使用統(tǒng)一接口包裝ffsl(l)圖元。
ConcurrentSkipList.h
實(shí)現(xiàn)了用證實(shí)正確的可擴(kuò)展并發(fā)跳躍表(Provably Correct Scalable Concurrent Skip List)描述的結(jié)構(gòu),這種跳躍表由Herlihy及其他人共同開發(fā)。
Conv.h
各種數(shù)據(jù)轉(zhuǎn)換例程(尤其是to和from字符串),針對速度和安全進(jìn)行了優(yōu)化。
DiscriminatedPtr.h
類似boost::variant,但完全局限于指針。使用指針中***位、未使用的16位作為鑒別器。所以sizeof(DiscriminatedPtr<int, string, Widget>) == sizeof(void*)。
dynamic.h
動態(tài)類型對象,創(chuàng)建時關(guān)注JSON對象。
Endian.h
Endian轉(zhuǎn)換圖元。
Escape.h
以C方式轉(zhuǎn)義字符串。
eventfd.h
針對eventfd系統(tǒng)調(diào)用的包裝器。
FBString.h
嵌入式實(shí)現(xiàn)std::string,進(jìn)行了諸多優(yōu)化。
FBVector.h
基本上嵌入式實(shí)現(xiàn)std::vector,進(jìn)行了諸多優(yōu)化。
Foreach.h
偽語句(作為宏語句來實(shí)現(xiàn)),用于迭代。
Format.h
Python式樣的格式化實(shí)用組件。
GroupVarint.h
針對32位值的Group Varint編碼。
Hash.h
各種流行的哈希函數(shù)實(shí)現(xiàn)。
Histogram.h
一個簡單的類,用于收集直方圖數(shù)據(jù)。
IntrusiveList.h
方便類型定義,用于使用boost::intrusive_list。
json.h
JSON序列化器和反序列化器。使用dynamic.h。
Likely.h
針對__builtin_expect的包裝器。
Malloc.h
內(nèi)存分配助手,尤其是使用jemalloc時。
MapUtil.h
一種助手,用于查找聯(lián)合容器中的項(xiàng)目(比如std::map和std::unordered_map)。
PackedSyncPtr.h
一種高度專業(yè)化的數(shù)據(jù)結(jié)構(gòu),含有指針、1位旋轉(zhuǎn)鎖和15位整數(shù),它們都在一個64位單詞中。
Preprocessor.h
不好但又必不可少的組件。
PrettyPrint.h
針對數(shù)字的美化打印組件,用于添加所用單元的后綴:字節(jié)(kb、MB等)、度量單位后綴(k、M和G等)以及時間(s、ms、us和ns等)。
ProducerConsumerQueue.h
無鎖單讀取器單寫入器隊(duì)列。
Random.h
只定義了一個函數(shù):randomNumberSeed()。
Range.h
Boost式樣的范圍工具和StringPiece專門化。
RWSpinLock.h
快速而緊湊的讀取器/寫入器旋轉(zhuǎn)鎖。
ScopeGuard.h
老式ScopeGuard用語的C++11版本。
SmallLocks.h
非常小的旋轉(zhuǎn)鎖(1字節(jié)和1位)。
small_vector.h
一種向量,含有小緩沖器方面的優(yōu)化和可選的嵌入式PicoSpinLock。
sorted_vector_types.h
類似std::map的集合體,但是作為排序向量來實(shí)現(xiàn)。
StlAllocator.h
標(biāo)準(zhǔn)模板庫(STL分配器),包裝簡單的分配/取消分配接口。
String.h
連接folly::fbstring和std::string的字符串實(shí)用組件。
Synchronized.h
高級同步庫。
System.h
解碼和errno實(shí)用組件。
ThreadCachedInt.h
使用線程緩存的高性能原子增量。
ThreadLocal.h
經(jīng)過改進(jìn)的線程本地存儲,用于存儲非平凡類型。
TimeoutQueue.h
按項(xiàng)目設(shè)定超時的隊(duì)列。
Traits.h
類型特性,補(bǔ)充了在標(biāo)準(zhǔn)的C++11頭<traits>中定義的那些類型特性。
Unicode.h
定義了codePointToUtf8函數(shù)。
【編輯推薦】