1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        幾個(gè)秒殺 Go 官方庫的第三方開源庫

        共 2511字,需瀏覽 6分鐘

         ·

        2021-10-18 07:40

        Go 語言官方庫給我們一貫的印象是:強(qiáng)大、好用。但是,金無足赤,人無完人,在一些性能要求苛刻的場(chǎng)景例如 json 解析,某些官方庫的表現(xiàn)不盡如人意。

        本文介紹幾個(gè)對(duì)標(biāo)官方庫的開源庫,它們的性能遠(yuǎn)超前者。當(dāng)讀者在使用這些官方庫遇到性能問題時(shí),可以嘗試替換優(yōu)化。

        net/http -> fasthttp

        地址:https://github.com/valyala/fasthttp

        fasthttp號(hào)稱比net/http快十倍,其優(yōu)化的核心思路很簡單:資源復(fù)用。

        • 復(fù)用 goroutine,減輕 runtime 調(diào)度壓力;
        • 對(duì)象復(fù)用,大量使用 sync.Pool 減輕 GC 壓力。

        除了復(fù)用,還有其他的一些優(yōu)化手段,例如盡量避免 string 與 []byte 的轉(zhuǎn)換開銷等。

        這些優(yōu)化技巧和最佳實(shí)踐,在其 Github 主頁上已經(jīng)貼心給出:https://github.com/valyala/fasthttp#fasthttp-best-practices,建議閱讀學(xué)習(xí)。

        因?yàn)?/span>fasthttp的實(shí)現(xiàn)與標(biāo)準(zhǔn)庫差距較大,所以它與net/http的 API 接口是不同的,這導(dǎo)致從net/http重構(gòu)為fasthttp需要一些學(xué)習(xí)成本。

        使用fasthttp的知名項(xiàng)目:Fiber、Gearbox、atreugo 等。

        encoding/json -> jsoniter

        地址:https://github.com/json-iterator/go

        jsoniter(json-iterator)是一款快且靈活的 JSON 解析器,同時(shí)提供 Java 和 Go 兩個(gè)版本。官方稱 Golang 版本可以比標(biāo)準(zhǔn)庫(encoding/json快 6 倍之多。

        最重要的是,它與標(biāo)準(zhǔn)庫encoding/json完全兼容。

        • Marshal()
        #?encoding/json?
        import?"encoding/json"
        json.Marshal(&data)

        #?jsoniter
        import?jsoniter?"github.com/json-iterator/go"

        var?json?=?jsoniter.ConfigCompatibleWithStandardLibrary
        json.Marshal(&data)
        • Unmarshal()
        #?encoding/json
        import?"encoding/json"
        json.Unmarshal(input,?&data)

        #?jsoniter
        import?jsoniter?"github.com/json-iterator/go"

        var?json?=?jsoniter.ConfigCompatibleWithStandardLibrary
        json.Unmarshal(input,?&data)

        對(duì)其優(yōu)化原理感興趣的讀者可以看這里:http://jsoniter.com/benchmark.html#optimization-used

        golang/protobuf -> gogo/protobuf

        地址:https://github.com/gogo/protobuf

        ProtoBuf 的全稱是 Protocol Buffers,它是由 Google 開發(fā)和定義的與 XML、JSON 類似的一種協(xié)議格式,用于高效存儲(chǔ)與讀取結(jié)構(gòu)化數(shù)據(jù)。它基于二進(jìn)制,因此使用 ProtoBuf 能將數(shù)據(jù)壓縮得更小。

        gogo/protobuf是基于官方庫golang/protobuf的增強(qiáng)版實(shí)現(xiàn):

        • golang/protobuf更快地序列化與反序列化;
        • 更規(guī)范的 Go 結(jié)構(gòu);
        • 兼容golang/protobuf;
        • 可選地生成額外的幫助代碼,減少代碼輸入;
        • 可以生成測(cè)試代碼和 benchmark 代碼;
        • 其他序列化格式;

        有很多知名項(xiàng)目都在使用該庫,例如 etcd、k8s、docker swarmkit、tidb、nakama 等。

        html/template -> valyala/quicktemplate

        地址:https://github.com/valyala/quicktemplate

        quicktemplate啟發(fā)自 Python 的 Mako 項(xiàng)目,是一個(gè)快速、強(qiáng)大且易于使用的 Go 模板渲染引擎,它的主要特性如下:

        • quicktemplate會(huì)先將編寫的模板代碼轉(zhuǎn)換為 Go 語言代碼,再進(jìn)行編譯渲染。因此,它比標(biāo)準(zhǔn)庫html/template快 20 倍以上。
        • quicktemplate的語法與 Go 語法非常類似,幾乎沒有學(xué)習(xí)成本。
        • 幾乎所有的 bug 都能在模板編譯時(shí)被捕獲,因此在實(shí)際項(xiàng)目中,很少會(huì)有受模板相關(guān)的bug影響。
        • 模板中可以嵌入任意 Go 代碼。

        雖然quicktemplate的主要目的是生成 HTML,但它也可用于生成其他數(shù)據(jù)。

        例如,使用quicktemplate可以輕松實(shí)現(xiàn) JSON 和 XML 序列化,并且通過quicktemplate的序列化通常也會(huì)比通過標(biāo)準(zhǔn)庫encoding/jsonencoding/xml更快。

        總結(jié)

        本文列出這幾個(gè)庫并不是讓你去立刻替換官方庫。例如net/http包,實(shí)際上它已經(jīng)可以滿足大多數(shù)使用場(chǎng)景。

        在使用官方庫時(shí)遇到了問題,我們很容易通過搜索引擎找到解決方案,或者直接向 Go 官方提 issue 。當(dāng)切換為開源庫時(shí),如果遇到了問題,并不一定能及時(shí)得到處理。

        官方庫的 API 幾乎可以保證能與 Go 版本的迭代一直兼容,而三方庫可能存在潛在的版本兼容問題,這也是切換時(shí)需要考慮的問題。

        本文列出來的幾個(gè)開源庫,它們的重點(diǎn)都是優(yōu)化對(duì)應(yīng)官方庫的性能問題。我們可以從這些開源庫中,學(xué)到很多實(shí)用的 Go 代碼優(yōu)化技巧。

        當(dāng)然,如果你的項(xiàng)目中因?yàn)檫@些官方庫而導(dǎo)致了性能問題,不妨一試。


        ? ?


        喜歡明哥文章的同學(xué)
        歡迎長按下圖訂閱!

        ???

        瀏覽 34
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            啊轻点灬太粗嗯太深了用力太子妃 | free性videos护士黑人 | 亚洲中文字幕网站 | 天天橹一橹 | 欧美色交 | 日本无码一区二区三区 | 操黑丝美女| 欧美高清无码在线 | 操逼操123 | 天天摸天天摸 |