云尊幣(WC)一一是一種以區(qū)塊鏈為底層安全技術的加密數(shù)字資產(chǎn),它的發(fā)展趨勢和價值將隨著時間的推移而日益彰顯。云尊加密數(shù)字資產(chǎn)的發(fā)行量源于龐大的經(jīng)銷商數(shù)量和可循環(huán)的綠色生態(tài)系統(tǒng),目前得到了全球各地的忠誠支持者支持 。
云尊幣滿足了所有這些需求,它消除了巨大的算力和處理在工作證明所帶來的競爭。云尊幣是一款采用了工作證明(POW)和權益證明(POS)雙重共識機制的加密數(shù)字資產(chǎn),它由加密技術(SCRYPT) 作為保證的,由區(qū)塊鏈中的分布式節(jié)點維護,允許用戶在網(wǎng)絡上進行點對點交易,而不受任何企業(yè)、中介或人為因素的干擾。
云尊幣技術架構
基于區(qū)塊鏈的應用要可靠落地 , 我們認為需要將傳統(tǒng)技術體系基于區(qū)塊鏈系統(tǒng)進行整合,讓區(qū)塊鏈技術恰當?shù)娜谌氲狡脚_。 區(qū)塊鏈技術的安全、不可篡改等特性, 保證了去中心化可靠性,成熟技術的有序結合也保證了系統(tǒng)性能穩(wěn)定流暢。
傳統(tǒng)銀行系統(tǒng)里的電子交易通常是可逆的,如果有人竊取你的信用卡金額,你可以對這項交易提出質疑,在大多數(shù)情況下?lián)p失是由銀行或商家承擔,消費者不用自掏腰包。這對消費者而言十分方便,但卻要求金融系統(tǒng)必須是一個相當嚴謹?shù)恼\信網(wǎng)。允許一個新成員加入就給其他每位成員增加了風險。所以當前的金融機構不愿與不知名或資本不雄厚的電子商務網(wǎng)站對接,這也是可以理解的。云尊幣就不一樣了,由于交易是經(jīng)過密碼認證的并且不可逆,所以沒有必要對接入該網(wǎng)絡加以限制。接受毫不相識的人的付款也沒有風險。這意味著,作為一個基于云尊幣的商家或者金融中介的門檻將會降低,使誠信的從業(yè)者更容易的加入商務活動,而各種隱含欺詐動機的行為無法得以實施。接受云尊幣也可使商家避免許多管理間接費,使交易得到更多的保障。
?
1、云尊幣數(shù)據(jù)層
云尊幣的區(qū)塊鏈數(shù)據(jù)存儲系統(tǒng)是由關系型數(shù)據(jù)庫(sqlite)和 kv 數(shù)據(jù)庫組成,其中關系型數(shù)據(jù)庫用來存儲區(qū)塊頭信息和每筆交易的具體信息, kv 數(shù)據(jù)庫主要存儲區(qū)塊頭、交易和狀態(tài)表序列化后的數(shù)據(jù)。
這樣處理的主要目的是單純在查詢區(qū)塊頭信息和具體每筆交易的時候,可以直接從關系型數(shù)據(jù)庫中查找;而要構造整個區(qū)塊數(shù)據(jù)的時候,除了從關系型數(shù)據(jù)庫構造區(qū)塊頭信息外,還要依據(jù)區(qū)塊頭里的交易根哈希和狀態(tài)表根哈希從 kv數(shù)據(jù)庫中獲取具體的交易和狀態(tài)表信息。
區(qū)塊頭信息的序列化具體步驟:
交易的序列化具體步驟:
下表分別是 Ledgers 和 Transactions 表結構。
1、1 關系型數(shù)據(jù)庫(sqlite)的特性
關系型數(shù)據(jù)庫(sqlite)誕生于 2000 年 5 月。作為一個自包含的、基于文件的數(shù)據(jù)庫,SQLite 提供了非常出色的工具集能夠處理所有類型的數(shù)據(jù),與托管在服務器上基于進程的關系型數(shù)據(jù)庫相比它的約束更少,也更易用。
這是一款輕型的嵌入式數(shù)據(jù)庫,它占用資源非常的低,在嵌入式設備中,可能只需要幾百 K 的內存就足夠了。它的處理速度比 Mysql、PostgreSQL 這兩款著名的數(shù)據(jù)庫都還快,sqlite 還具
有以下特性:
?零配置,無需安裝和配置
sqlite 的核心引擎本身不依賴第三方的軟件,使用它也不需要“安裝”。所以在部署的時候能夠省去不少麻煩。
?儲存在單一磁盤文件中的一個完整的數(shù)據(jù)庫
數(shù)據(jù)庫中所有的信息(比如表、視圖、觸發(fā)器、等)都包含在一個文件內。這個文件可以 copy 到其它目錄或其它機器上,也照用不誤。
?數(shù)據(jù)庫文件可以在不同字節(jié)順序的機器間自由共享
sqlite 支持多種系統(tǒng),除了主流操作系統(tǒng),QLite 也支持了很多冷門的操作系統(tǒng)。例如對很多嵌入式系統(tǒng)(比如 Android、Windows Mobile、Symbin、Palm、VxWorks 等)的支持。SQLite生成的數(shù)據(jù)庫文件可以在各種智能設備進行移植,為云尊幣普及到其他智能設備提供了基礎。
?足夠小,全部源代碼大約幾百 KB,能夠實現(xiàn)在輕便的智能設備中運行。
?比目前流行的大多數(shù)數(shù)據(jù)庫對數(shù)據(jù)的操作要快。
1、2 sqlite 數(shù)據(jù)庫工作原理
qlite 主要由 7 個構件子系統(tǒng)(也就是模塊)組成,這些模塊被分割為前端解析系統(tǒng)和后端引擎。
前端:
前端預處理應用程序傳遞過來的 SQL 語句和 SQLite 命令。對獲取的編碼分析,優(yōu)化,并轉換 為后端能夠執(zhí)行的 SQLite 內部字節(jié)編碼。前端可分為三個模塊。
?標示分析(Tokenizer):將輸入的 SQL 語句分成標識符。
?語法分析(Parser):解析器分析通過標識器產(chǎn)生的標識分析語句的結構,并且得到一顆語法樹。解析器同時也包含了重構語法樹的優(yōu)化器,因此能夠找到一顆產(chǎn)生一個高效的字節(jié)編碼程序的語法樹。
?代碼生成器(Code Generator):代碼生成器遍歷語法樹,并且生成一個等價的字節(jié)編碼程序,前端實現(xiàn)了sqlite3_prepare API 函數(shù)。
后端:
后端是用來解釋字節(jié)編碼程序的引擎。該引擎做的才是真正的數(shù)據(jù)庫處理工作。后端部分由四個模塊組成。
?虛擬機(VM):VM 模塊是一個內部字節(jié)編碼語言的解釋器。它通過執(zhí)行字節(jié)編碼語句來實現(xiàn) SQL 語句的工作。它是數(shù)據(jù)庫中數(shù)據(jù)的最終的操作者。它把數(shù)據(jù)庫看成表和索引的集合,而表和索引則是一系列的元組或者記錄。
?B/B+樹:B/B+樹模塊把每一個元組集組織進一個一次排好序的樹狀數(shù)據(jù)結構中,表和索引被分別置于單獨的 B+和B樹中。該模塊幫助 VM 進行搜索,插入和刪除樹中的元組。它也幫助 VM創(chuàng)建新的樹和刪除舊的樹。
?頁面調度程序(pager):頁面調度程序模塊在原始文件的上層實現(xiàn)了一個面向頁面的數(shù)據(jù)庫文件抽象。它管理 B/B+樹使用的內存內緩存(數(shù)據(jù)庫頁的),另外,他也管理文件的鎖定,并用日志來實現(xiàn)事物的 ACID 屬性。
?操作系統(tǒng)交界面(system interface):操作系統(tǒng)界面模塊提供了對應于不同本地操作系統(tǒng)的統(tǒng)一交界面,后端實現(xiàn)了sqlite3_bind_*,sqlite3_setp,sqlite3_coloumn_*,sqlite3_reset 和 sqlite3_finalize API 函數(shù)。
關系型數(shù)據(jù)庫的特點能夠滿足云尊幣在輕便智能設備中運行的要求,并且能夠在多種技術架構的的操作系統(tǒng)中進行移植,而無需很大的改動,這保證了云尊幣在普通群體的能夠快速的推廣和普及。
2、加密算法
數(shù)據(jù)加密的基本過程就是對原來為明文的文件或數(shù)據(jù)按某種算法進行處理,使其成為不可讀的一段代碼。目前區(qū)塊鏈一般常用的加密算法有對稱加密、非對稱加密、公私匙、Hash 算法等
等。
對稱加密:對稱加密是最快速、最簡單的一種加密方式,加密(encryption)與解密(decryption)用的是同樣的密(secretkey)。對稱加密通常使用的是相對較小的密鑰,一般小于 256bit。密鑰的大小既要照顧到安全性,也要照顧到效率,是一個 trade-off。
非對稱加密:非對稱加密為數(shù)據(jù)的加密與解密提供了一個非常安全的方法,它使用了一對密鑰,公鑰(public key)和私鑰(privatekey)。私鑰只能由一方安全保管,不能外泄,而公鑰則可以發(fā)給任何請求它的人。非對稱加密使用這對密鑰中的一個進行加密,而解密則需要另一個密鑰。
私鑰(private key):非公開,是一個 256 位的隨機數(shù),由用戶保管且不對外開放。私鑰通常是由系統(tǒng)隨機生成,是用戶賬戶使用權及賬戶內資產(chǎn)所有權的唯一證明,其有效位長足夠大,因此不可能被攻破,無安全隱患。
公鑰(public key):可公開,每一個私鑰都有一個與之相匹配的公鑰。 ECC 公鑰可以由私鑰通過單向的、確定性的算法生成,目前常用的方案包括: secp256r1(國際通用標準)、secp256k1(比特幣標準)和 SM2(中國國標)Photon chain 控制鏈與初始數(shù)據(jù)鏈選擇 secp256r1 作為密鑰方案。
Hash 算法:通常 Hash 算法是指安全散列算法 SHA(Secure Hash Algorithm),該算法是美國國家安全局 (NSA) 設計,美國國家標準與技術研究院(NIST) 發(fā)布的一系列密碼散列函數(shù),包括 SHA-1、SHA-224、SHA-256、SHA-384 和 SHA-512 等變體。目前比特幣采用 SHA-256 算法。Photon chain 除 PoW 外,其余 Hash 算法均指 SHA-256。
云尊幣在此基礎上進行了改進,使用的同態(tài)加密是一種無需對加密數(shù)據(jù)進行提前解密就可以執(zhí)行計算的方法。它提供了一種急需的方法,能夠在原有基礎上使用區(qū)塊鏈技術。
通過使用同態(tài)加密技術在區(qū)塊鏈上存儲數(shù)據(jù)可以達到一種完美的平衡,不會對區(qū)塊鏈屬性造成任何重大的改變。也就是說,區(qū)塊鏈仍舊是公有區(qū)塊鏈。然而,區(qū)塊鏈上的數(shù)據(jù)將會被加密,因此照顧到了公有區(qū)塊鏈的隱私問題,同態(tài)加密技術使公有區(qū)塊鏈具有私有區(qū)塊鏈的隱私效果。
2、1 同態(tài)加密算法處理過程
如圖 3 所示,主要是對私有信息進行保護。Alice 有私有的函數(shù) fA 和私有的信息 XA,Bob 把私有信息 yB用私有公鑰 pkB加密得到 E(y)發(fā)送給 Alice,Alice 用自己的私有函數(shù) fA 加密私有信息 XA 和 E(yB),由于同態(tài)性質,函數(shù) fA 被隱藏,而 Bob 獲得 E(fA(XA,yB))。Bob 通過私有的私鑰加密 D(E(fA (XA,yB)))=fA (XA,yB)。
如圖 4 所示,主要是對私有的操作函數(shù)進行保護。Alice 有私有的函數(shù)以,并用私有公鑰 pkA加密函數(shù) fA發(fā)送給 Bob,Bob根據(jù)私有信息 XB計算 E(fA )(XB),由于同態(tài)性質,因此隱藏了Bob 的信息 XB,得到 E(fa(xb)),并發(fā)送給 Alice,Alice 用私鑰解密獲得 fA(XB)。
同態(tài)加密技術不僅提供了隱私保護,它同樣會允許隨時訪問公用區(qū)塊鏈上的加密數(shù)據(jù)進行審計或其他目的。換句話說,使用同態(tài)加密在公用區(qū)塊鏈上存儲數(shù)據(jù)將能夠同時提供公有和私有區(qū)塊鏈的最好的部分。
如果 E 為針對 function_a 的全同態(tài)函數(shù),即
其中,加密操作為 E,明文為 m,加密得 e,如果對于任意復雜明文操作 function_a,都能針對 E 構造出相應的 function_b。那么,E 就是一個針對 function_a 的同態(tài)加密算法,則稱 E 為針對 function_a 的全同態(tài)加密算法。全同態(tài)加密的目的在于找到一種能在加密的數(shù)據(jù)上進行任意數(shù)量的加法和乘法運算的加密算法,使得對加密數(shù)據(jù)進行某種操作所得到的結果恰好等于對加密前的數(shù)據(jù)進行預期操作再加密后得到的密文。
3、Netty 構建高性能高可用的去中心化網(wǎng)絡
3、1 Netty 的 I/O 模型
基于非阻塞 I/O 實現(xiàn),底層依賴的是 JDK NIO 框架的Selector。
Selector 提供選擇已經(jīng)就緒的任務的能力。簡單來講,Selector 會不斷地輪詢注冊在其上的 Channel,如果某個Channel 上面有新的 TCP 連接接入、讀和寫事件,這個 Channel就處于就緒狀態(tài),會被 Selector 輪詢出來,然后通過SelectionKey 可以獲取就緒 Channel 的集合,進行后續(xù)的 I/O操作。
一個多路復用器 Selector 可以同時輪詢多個 Channel,由于JDK1.5_update10 版本(+)使用了 epoll()代替?zhèn)鹘y(tǒng)的 select實現(xiàn),所以它并沒有最大連接句柄 1024/2048 的限制。這也就意味著只需要一個線程負責 Selector 的輪詢,就可以接入成千上萬的客戶端,這確實是個非常巨大的技術進步。使用非阻塞 I/O 模型之后,Netty 解決了傳統(tǒng)同步阻塞 I/O帶來的性能、吞吐量和可靠性問題。
3、2 線程調度模型
常用的 Reactor 線程模型有三種,分別如下:
Reactor 單線程模型:Reactor 單線程模型,指的是所有的I/O 操作都在同一個 NIO 線程上面完成。對于一些小容量應用場景,可以使用單線程模型。
Reactor 多線程模型:Rector 多線程模型與單線程模型最大的區(qū)別就是有一組 NIO 線程處理 I/O 操作。主要用于高并發(fā)、大業(yè)務量場景。
主從 Reactor 多線程模型:主從 Reactor 線程模型的特點是服務端用于接收客戶端連接的不再是個 1 個單獨的 NIO 線程,而是一個獨立的 NIO 線程池。利用主從 NIO 線程模型,可以解決 1個服務端監(jiān)聽線程無法有效處理所有客戶端連接的性能不足問題。
事實上,Netty 的線程模型并非固定不變,通過在啟動輔助類中創(chuàng)建不同的 EventLoopGroup 實例并通過適當?shù)?a target="_blank">參數(shù)配置,就可以支持上述三種 Reactor 線程模型。
在大多數(shù)場景下,并行多線程處理可以提升系統(tǒng)的并發(fā)性能。但是,如果對于共享資源的并發(fā)訪問處理不當,會帶來嚴重的鎖競爭,這最終會導致性能的下降。為了盡可能的避免鎖競爭帶來的性能損耗,可以通過串行化設計,即消息的處理盡可能在同一個線程內完成,期間不進行線程切換,這樣就避免了多線程競爭和同步鎖。
為了盡可能提升性能,Netty 采用了串行無鎖化設計,在 I/O線程內部進行串行操作,避免多線程競爭導致的性能下降。表面上看,串行化設計似乎 CPU 利用率不高,并發(fā)程度不夠。但是,通過調整 NIO 線程池的線程參數(shù),可以同時啟動多個串行化的線程并行運行,這種局部無鎖化的串行線程設計相比一個隊列-多個工作線程模型性能更優(yōu)。
3、3 序列化方式
影響序列化性能的關鍵因素總結如下:
序列化后的碼流大?。ňW(wǎng)絡帶寬占用)、序列化&反序列化的性能(CPU 資源占用)
并發(fā)調用的性能表現(xiàn):穩(wěn)定性、線性增長、偶現(xiàn)的時延毛刺等對 Java 序列化和二進制編碼分別進行性能測試,編碼 100 萬次,測試結果表明:Java 序列化的性能只有二進制編碼的 6.17%左右。
Netty 默認提供了對 Google Protobuf 的支持,通過擴展Netty 的編解碼接口,用戶可以實現(xiàn)其它的高性能序列化框架,例如 Thrift 的壓縮二進制編解碼框架。
不同的應用場景對序列化框架的需求也不同,對于高性能應用場景Netty默認提供了Google的Protobuf二進制序列化框架,如果用戶對其它二進制序列化框架有需求,也可以基于 Netty 提供的編解碼框架擴展實現(xiàn)。
3、4 采用 Netty 框架的原因
1)設計
· 統(tǒng)一的 API,適用于不同的協(xié)議(阻塞和非阻塞)
· 基于靈活、可擴展的事件驅動模型
· 高度可定制的線程模型
· 可靠的無連接數(shù)據(jù) Socket 支持(UDP)
2)性能
·更好的吞吐量,低延遲、
·更省資源
·盡量減少不必要的內存拷貝
3)安全
完整的 SSL/TLS 和 STARTTLS 的支持能在 Applet 與Android 的限制環(huán)境運行良好
4)健壯性
·不再因過快、過慢或超負載連接導致 OutOfMemoryError不再有在高速網(wǎng)絡環(huán)境下 NIO 讀寫頻率不一致的問題
5)易用
· 完善的 JavaDoc,用戶指南和樣例
· 簡潔簡單
· 僅信賴于 JDK1.5
Netty 框架能夠為云尊幣帶來更好的兼容性、安全性、穩(wěn)定性可操作性,為云尊幣多功能性的應用快速讀寫提供基礎,目前Netty 已經(jīng)在很多不同的領域取得了良好的效果。
大數(shù)據(jù)領域:經(jīng)典的 Hadoop 的高性能通信和序列化組件Avro的RPC 框架,默認采用 Netty 進行跨節(jié)點通信,它的 NettyService 基于 Netty 框架二次封裝實現(xiàn)。
大數(shù)據(jù)計算往往采用多個計算節(jié)點和一個/N 個匯總節(jié)點進行分布式部署,各節(jié)點之間存在海量的數(shù)據(jù)交換。由于 Netty 的綜合性能是目前各個成熟 NIO 框架中最高的,因此,往往會被選中用作大數(shù)據(jù)各節(jié)點間的通信。
企業(yè)軟件:企業(yè)和 IT 集成需要 ESB,Netty 對多協(xié)議支持、私有協(xié)議定制的簡潔性和高性能是 ESB RPC 框架的首選通信組件。事實上,很多企業(yè)總線廠商會選擇 Netty 作為基礎通信組件,用于企業(yè)的 IT 集成。
通信行業(yè):Netty 的異步高性能、高可靠性和高成熟度的優(yōu)點,使它在通信行業(yè)得到了大量的應用。
4、云尊幣共識機制
云尊幣采用 PoW+PoS 的混合共識機制,能夠將受眾群體最大化。持有云尊幣的用戶與礦工均可以參與到投票中,共同參與重大決定,數(shù)字資產(chǎn)持有者與礦工都可以影響預先編制好的更新,而這才是真正的去中心化。
4、1 POW 工作量證明的過程
POW 是一個經(jīng)過廣泛測試,并具有抗攻擊性和拓展性的解決方案。 我們可以把工作量證明的步驟大致歸納如下:
生成 Coinbase 交易,并與其他所有準備打包進區(qū)塊的交易組成交易列表,通過 Merkle Tree 算法生成 Merkle Root Hash
把 Merkle Root Hash 及其他相關字段組裝成區(qū)塊頭,將區(qū)塊頭的 80 字節(jié)數(shù)據(jù)(Block Header)作為工作量證明的輸入
不停的變更區(qū)塊頭中的隨機數(shù)即 nonce 的數(shù)值,并對每次變更 后 的 的 區(qū) 塊 頭 做 雙 重 SHA256 運算(即SHA256(SHA256(Block_Header))),將結果值與當前網(wǎng)絡的目標值做對比,如果小于目標值,則解題成功,工作量證明完成。
該過程可以用下圖表示:
4、2 權益證明(Proof of Stake)
在工作量證明中,各個節(jié)點協(xié)助創(chuàng)建和驗證新的區(qū)塊。獎勵與貢獻給整個網(wǎng)絡的算力資源成正比。當然也會出現(xiàn)惡意攻擊或者惡意欺騙其他節(jié)點的風險出現(xiàn)。權益證明系統(tǒng)試圖先保留工作量證明的好處,同時消除一些潛在的安全問題。
權益證明機制可以輔助加強工作量證明,而不是取代它。其可以簡單地作為添加和批準新區(qū)塊的附加步驟。
?PoS 背后的理性邏輯
(1)使權益所有者能夠通過投票決定記賬人
(2)最大化權益所有者的紅利
(3)最小化保證網(wǎng)絡安全的消耗
(4)最大化網(wǎng)絡的性能
(5)最小化運行網(wǎng)絡的成本
云尊幣這樣設計的好處,權益所有者擁有控制權,PoS 的根本特性是權益所有者保留了控制權,從而使系統(tǒng)去中心化??梢蕴岣邊^(qū)塊鏈數(shù)字資產(chǎn)的安全性,因為工作量證明可能存在 51%攻擊的潛在風險,控制大部分算力資源的人將可以輕易控制整個網(wǎng)絡。
在技術上層面上,云尊運用了對區(qū)塊的投票交易機制(一種靈活且實用的 PoS 機制),并把具備雙層鏈結構和兩極挖礦思想的加強版 PoW 機制與該 PoS 機制進行有機結合從而得到新型混合共識機制,在該新型混合共識中,keyBlock 必須獲得足夠的贊同票才會被視為合法,因此 PoW 和 PoS 都能參與系統(tǒng)共識并發(fā)揮重要作用。
5、云尊幣解決區(qū)塊鏈網(wǎng)絡慢的弊端
云尊幣是如何解決區(qū)塊鏈網(wǎng)絡慢的呢?通過“RingBuffer”和“Disruptor”來實現(xiàn),
Disruptor 它是一個開源的并發(fā)框架,能夠在無鎖的情況下實現(xiàn)網(wǎng)絡的 Queue 并發(fā)操作,Disruptor 為什么會這么快?
(1)鎖的缺點
Disruptor 根本就不用鎖。取而代之的是,在需要確保操作是線程安全的(特別是,在多生產(chǎn)者的環(huán)境下,更新下一個可用的序列號)地方,我們使用 CAS(Compare And Swap/Set)操作。CAS 操作比鎖消耗資源少的多,因為它們不牽涉操作系統(tǒng),它們直接在 CPU 上操作。所有訪問者都記錄自己的序號的實現(xiàn)方式,允許多個生產(chǎn)者與多個消費者共享相同的數(shù)據(jù)結構。在每個對象中都能跟蹤序列號(ring buffer,claim Strategy,生產(chǎn)者和消費者),加上神奇的 cache line padding,就意味著沒有為偽共享和非預期的競爭。
(2)緩存行填充
CPU 來執(zhí)行所有運算和程序。主內存(RAM)是你的數(shù)據(jù)(包括代碼行)存放的地方。Disruptor 的目標是盡可能多的在內存中運行,如果你訪問一個 long 數(shù)組,當數(shù)組中的一個值被加載到緩存中,它會額外加載另外多個。因此你能非常快地遍歷這個數(shù)組。事實上,你可以非??焖俚谋闅v在連續(xù)的內存塊中分配的任意數(shù)據(jù)結構。
(3)偽共享
(4)揭秘內存屏障
內存屏障作為另一個 CPU 級的指令,沒有鎖那樣大的開銷。內核并沒有在多個線程間干涉和調度。但凡事都是有代價的。內存屏障的確是有開銷的——編譯器/cpu 不能重排序指令,導致不可以盡可能地高效利用 CPU,另外刷新緩存亦會有開銷。Disruptor 的實現(xiàn)對序列號的讀寫頻率盡量降到最低。對volatile 字段的每次讀或寫都是相對高成本的操作。也應該認識到在批量的情況下可以獲得很好的表現(xiàn)。
我們使用 Disruptor 和 Ring Buffer。這種數(shù)據(jù)結構,是因為它給我們提供了可靠的消息傳遞特性。這個理由就足夠了,不過它還有一些其他的優(yōu)點。首先,Ring Buffer 比鏈表要快,因為它是數(shù)組,而且有一個容易預測的訪問模式。這很不錯,對 CPU高速緩存友好 (CPU-cache-friendly)-數(shù)據(jù)可以在硬件層面預加載到高速緩存,因此 CPU 不需要經(jīng)?;氐街鲀却?RAM 里去尋找 Ring Buffer 的下一條數(shù)據(jù)。第二點,Ring Buffer 是一個數(shù)組,你可以預先分配內存,并保持數(shù)組元素永遠有效。這意味著內存垃圾收集(GC)在這種情況下幾乎什么也不用做。此外,也不像鏈表那樣每增加一條數(shù)據(jù)都要創(chuàng)建對象-當這些數(shù)據(jù)從鏈表里刪除時,這些對象都要被清理掉。
評論
查看更多