golang第三方庫fasthttp為什麼要使用slice而不是map來儲存header?

時間 2021-05-09 20:21:20

1樓:歲寒

我覺得問題裡別人的回答都挺好,簡而言之就是slice簡單,header引數少,沒必要放map。

如果從資料結構的角度來說,可能slice相對更輕量級,比map更能充分的利用記憶體把

其實這些star多的庫沒什麼神秘的

2樓:Coldwings

為了fast,確切說是為了減少記憶體copy

因為http協議就是個純字元流,收進來最自然的結構是byte array,那麼用slice做個view很簡單,不需要記憶體copy,只需要根據分隔符劃分slice就好。slice相當於乙個帶offset和length的引用。

做個map需要把這些內容copy出來,進行確定的一次記憶體內容copy。

3樓:owen

裝逼,slice kv 明顯更唬人,一聽就高大上,看上去就高效能。

空間,slice結構要比map簡單,先不說hmap的屬性字段好幾個,bucket也好幾個字段。

效能,slice記憶體是連續的,cpu快取友好,但slice做map需要做去重的對比,理論上是遍歷整個陣列,而map解決衝突也是需要計算索引值值,當還有衝突時,就需要遍歷overflow next bucket了。考慮到header一半沒幾條kv,所以直接遍歷應該很快,而map計算code值最少也需要十幾個ns。map裡的bucket當未滿足rehash時,其實也是遍歷bucket的。

就header的需求來說,slice kv會更快。

gc, 就上面ppt例子來說,slice kv更適合整個結構都復用。map裡面的kv都超過128byte會退化到指標,gc掃瞄來說值型別要比指標快的多的多。

上面只是個人的看法,有興趣的朋友可以做下benchmark測試一下,還是用資料說話最靠譜。

4樓:

因為slice實現比map簡單,

在item不多的情況下,遍歷查詢不比hash查詢慢另外,題中的這個kv結構可以放在sync.pool中,避免頻繁建立和銷毀記憶體

而map沒法放pool

題外話,有序的陣列,利用二分法完全可以替代hash

RequireJS 包裝第三方庫的常規做法是什麼?

寸志 包裝第三方庫的正確做法就是不包裝!而是使用 RequireJS 提供的配置來實現 requirejs config underscore foo Then,later in a separate file,call it MyModel.js a module is defined,speci...

Swift 有哪些優秀的第三方庫?

強烈推薦 DCFrame bytedance DCFrame 可以非常簡單的管理複雜頁面,輕鬆實現模組間的通訊問題。相比IGListKit,更加輕量,而且功能綜合要比IGListKit多。 shadow BreakOutToRefresh 乙個下拉重新整理打磚塊的swift庫SDRefreshVie...

pycharm沒辦法安裝第三方庫怎麼解決?

酒罈壇兒 1.你這個應該是安裝python環境的時候出的問題,你在安裝python環境的時候預設沒有安裝 pip 和 setuptools,如果想要用pycharm安裝第三方庫你至少的先把python的包管理工具pip裝好 2.你的第三方庫不應該安裝在系統環境裡面,最好建立乙個虛擬環境 Herobr...