1. 程式人生 > >揭祕Facebook官方底層C++底層函式Folly

揭祕Facebook官方底層C++底層函式Folly

Folly,FackBook的一個C++底層庫,一切為了效能https://github.com/facebook/folly

Folly與Boost、當然還有std等元件庫的關係是互為補充,而不是彼此競爭。實際上,只有當我們需要的東西既沒有,也無法滿足所需的效能要求時,我們才開始定義自己的元件。

效能問題貫穿著Folly的大部分,有時導致比較具有特質性的設計(比如PackedSyncPtr.h和SmallLocks.h)。整體上確保良好的效能是所有Folly的統一主題。

邏輯設計

Folly是一組相對獨立的元件的集合體,有些元件就是幾個符號這麼簡單。內部依賴方面沒有限制,這意味著某個特定的folly模組可以使用其他任何的folly元件。

所有符號都在頂層的名稱空間folly中加以定義,當然除了巨集。巨集名稱是ALL_UPPERCASE。名稱空間folly定義了其他的內部名稱空間,比如internal或detail。使用者程式碼應該不依賴那些名稱空間中的符號。

物理設計

在頂層,Folly採用經典的“結巴”(stuttering)方案folly/folly,這也是Boost及其他元件庫所採用的。第一個目錄充當庫的安裝根目錄(可能是以folly-1.0/這樣的形式);第二個目錄是新增檔案時用來辨別元件庫,比如#include "folly/FBString.h"。

目錄結構是扁平的(模仿名稱空間結構),也就是說我們沒有複雜的目錄層次結構(這個情況在將來的版本中可能會有變化)。子目錄experimental含有在folly裡面使用的檔案,可能用在Facebook端,但是被認為不夠穩定,無法在客戶端使用。你的程式碼不該使用folly/experimental中的檔案,以免你在更新Folly時,出現問題。

folly/folly/test子目錄包括了面向所有元件的單元測試,通常名為ComponentXyzTest.cpp,面向每個ComponentXyz.*。folly/folly/docs目錄含有說明文件。

相容性

目前,folly已在64位安裝版Fedora 17、Ubuntu 12.04和Debian wheezy的gcc 4.6上進行了測試。它不用改動,就可以在其他64位Linux平臺上執行。

元件

下面按字母順序介紹了一系列Folly元件,另外附有每個元件的簡短描述。

Arena.h,ThreadCachedArena.h

記憶體分配的簡單地方:多次記憶體分配同時被釋放。使用執行緒版本。

AtomicHashMap.h,AtomicHashArray.h

高效能的原子雜湊圖,採用幾乎無鎖的操作。

Benchmark.h

用於程式碼基準測試的小型框架。客戶端程式碼註冊基準測試,可選情況下使用一個變數來規定基準測試的範圍(迭代和工作集大小等)。框架執行基準測試(受制於命令列標記),生成帶計時資訊的格式化輸出。

Bits.h

各種位處理實用元件,針對速度而優化。

Bits.h

位變換函式,使用統一介面包裝ffsl(l)圖元。

ConcurrentSkipList.h

實現了用證實正確的可擴充套件併發跳躍表(Provably Correct Scalable Concurrent Skip List)描述的結構,這種跳躍表由Herlihy及其他人共同開發。

Conv.h

各種資料轉換例程(尤其是to和from字串),針對速度和安全進行了優化。

DiscriminatedPtr.h

類似boost::variant,但完全侷限於指標。使用指標中最高位、未使用的16位作為鑑別器。所以sizeof(DiscriminatedPtr<int, string, Widget>) == sizeof(void*)。

dynamic.h

動態型別物件,建立時關注JSON物件。

Endian.h

Endian轉換圖元。

Escape.h

以C方式轉義字串。

eventfd.h

針對eventfd系統呼叫的包裝器。

FBString.h

嵌入式實現std::string,進行了諸多優化。

FBVector.h

基本上嵌入式實現std::vector,進行了諸多優化。

Foreach.h

偽語句(作為巨集語句來實現),用於迭代。

Format.h

Python式樣的格式化實用元件。

GroupVarint.h

針對32位值的Group Varint編碼。

Hash.h

各種流行的雜湊函式實現。

Histogram.h

一個簡單的類,用於收集直方圖資料。

IntrusiveList.h

方便型別定義,用於使用boost::intrusive_list。

json.h

JSON序列化器和反序列化器。使用dynamic.h。

Likely.h

針對__builtin_expect的包裝器。

Malloc.h

記憶體分配助手,尤其是使用jemalloc時。

MapUtil.h

一種助手,用於查詢聯合容器中的專案(比如std::map和std::unordered_map)。

PackedSyncPtr.h

一種高度專業化的資料結構,含有指標、1位旋轉鎖和15位整數,它們都在一個64位單詞中。

Preprocessor.h

不好但又必不可少的元件。

PrettyPrint.h

針對數字的美化列印元件,用於新增所用單元的字尾:位元組(kb、MB等)、度量單位字尾(k、M和G等)以及時間(s、ms、us和ns等)。

ProducerConsumerQueue.h

無鎖單讀取器單寫入器佇列。

Random.h

只定義了一個函式:randomNumberSeed()。

Range.h

Boost式樣的範圍工具和StringPiece專門化。

RWSpinLock.h

快速而緊湊的讀取器/寫入器旋轉鎖。

ScopeGuard.h

老式ScopeGuard用語的C++11版本。

SmallLocks.h

非常小的旋轉鎖(1位元組和1位)。

small_vector.h

一種向量,含有小緩衝器方面的優化和可選的嵌入式PicoSpinLock。

sorted_vector_types.h

類似std::map的集合體,但是作為排序向量來實現。

StlAllocator.h

標準模板庫(STL分配器),包裝簡單的分配/取消分配介面。

String.h

連線folly::fbstring和std::string的字串實用元件。

Synchronized.h

高階同步庫。

System.h

解碼和errno實用元件。

ThreadCachedInt.h

使用執行緒快取的高效能原子增量。

ThreadLocal.h

經過改進的執行緒本地儲存,用於儲存非平凡型別。

TimeoutQueue.h

按專案設定超時的佇列。

Traits.h

型別特性,補充了在標準的C++11頭<traits>中定義的那些型別特性。

Unicode.h

定義了codePointToUtf8函式。

<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script> 閱讀(382) | 評論(0) | 轉發(1) | 給主人留下些什麼吧!~~ 評論熱議