日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

在 Go 中使用 Protocol Buffers

來源: 責(zé)編: 時間:2023-11-28 09:34:01 228觀看
導(dǎo)讀各位準(zhǔn)備好了嗎!這一次,我們將深入探討 Protocol Buffers(protobuf)及其在數(shù)據(jù)序列化中的超能力所在。介紹Protocol Buffers,也被稱為 protobuf,是由谷歌開發(fā)的一種語言無關(guān)的二進制序列化格式。其主要目的是為了高效地序列

各位準(zhǔn)備好了嗎!這一次,我們將深入探討 Protocol Buffers(protobuf)及其在數(shù)據(jù)序列化中的超能力所在。LrR28資訊網(wǎng)——每日最新資訊28at.com

LrR28資訊網(wǎng)——每日最新資訊28at.com

介紹

Protocol Buffers,也被稱為 protobuf,是由谷歌開發(fā)的一種語言無關(guān)的二進制序列化格式。其主要目的是為了高效地序列化結(jié)構(gòu)化數(shù)據(jù),用于系統(tǒng)間通信和數(shù)據(jù)存儲。LrR28資訊網(wǎng)——每日最新資訊28at.com

LrR28資訊網(wǎng)——每日最新資訊28at.com

Protocol Buffers 的主要優(yōu)勢:

  • 緊湊性:Protobuf 提供高效的序列化,生成較小的消息大小,提升帶寬利用效率。
  • 模式演進:Protobuf 支持模式演進而不破壞兼容性,允許對數(shù)據(jù)結(jié)構(gòu)進行無縫更新。
  • 高效的序列化和反序列化:Protobuf 提供快速高效的序列化,提升整體系統(tǒng)性能。
  • 跨平臺支持:Protobuf 允許不同平臺和語言之間無縫交換數(shù)據(jù)。

這些優(yōu)勢使得 Protobuf 成為在 Go 應(yīng)用程序中進行高效數(shù)據(jù)通信和存儲的強大工具。LrR28資訊網(wǎng)——每日最新資訊28at.com

它比 JSON 和 XML 更好的地方:

LrR28資訊網(wǎng)——每日最新資訊28at.com

XML,即可擴展標(biāo)記語言,就像一張地圖,用標(biāo)簽幫助組織和結(jié)構(gòu)化數(shù)據(jù)。它以一種人類和機器都能理解的方式呈現(xiàn)信息。然而,XML 可能冗長并占用更多空間,這可能降低性能,使數(shù)據(jù)傳輸效率降低。LrR28資訊網(wǎng)——每日最新資訊28at.com

JSON,即 JavaScript 對象表示法,就像一個信使,使用簡單的鍵值結(jié)構(gòu)來表示數(shù)據(jù)對象。它因易于閱讀和使用而在 Web 服務(wù)之間傳輸數(shù)據(jù)時變得流行。但 JSON 的基于文本的格式可能導(dǎo)致更大的文件大小,從而影響數(shù)據(jù)傳輸速度。LrR28資訊網(wǎng)——每日最新資訊28at.com

相比之下,Protocol Buffers(protobuf)在數(shù)據(jù)序列化領(lǐng)域脫穎而出。它就像一個魔術(shù),將數(shù)據(jù)轉(zhuǎn)換為緊湊高效的二進制格式。Protobuf 以快速的數(shù)據(jù)處理和適應(yīng)變化的數(shù)據(jù)結(jié)構(gòu)而聞名,并且在不破壞兼容性的情況下進行操作。它可以與不同的編程語言一起使用,并確保數(shù)據(jù)的可靠性。LrR28資訊網(wǎng)——每日最新資訊28at.com

總之,XML 和 JSON 各有用途,但如果您需要強大且高效的數(shù)據(jù)序列化解決方案,Protocol Buffer(protobuf)是首選。它提供緊湊性、速度、靈活性和兼容性,使其成為高效處理數(shù)據(jù)的首選方案。LrR28資訊網(wǎng)——每日最新資訊28at.com

在 Golang 中的序列化性能:Protocol Buffers vs. JSON

言歸正傳,讓我們動手實踐。LrR28資訊網(wǎng)——每日最新資訊28at.com

LrR28資訊網(wǎng)——每日最新資訊28at.com

訪問官方 Protocol Buffers GitHub 倉庫(https://github.com/protocolbuffers/protobuf)下載與您操作系統(tǒng)兼容的編譯器。LrR28資訊網(wǎng)——每日最新資訊28at.com

使用 .proto 文件格式定義一個 Protocol Buffers 消息模式。LrR28資訊網(wǎng)——每日最新資訊28at.com

syntax = "proto3";package main;option go_package = "/;msgmodel";message MyMessage {  int32 id = 1;  string name = 2;  string email = 3;}

編譯文件:LrR28資訊網(wǎng)——每日最新資訊28at.com

protoc — go_out=. ./*proto

這個命令從 protobuf 模式生成 Go 代碼綁定。--go_out 標(biāo)志指定輸出應(yīng)為 Go 語言。這將生成一個 msg.pb.go 文件,其中包含您的 protobuf 模式所需的代碼綁定。LrR28資訊網(wǎng)——每日最新資訊28at.com

在 Golang 中實現(xiàn)一個基準(zhǔn)測試,使用 protobuf 和 JSON 對大型數(shù)據(jù)集進行序列化:LrR28資訊網(wǎng)——每日最新資訊28at.com

package mainimport (    "encoding/json"    "github.com/golang/protobuf/proto"    "go-protobuf/model/message"    "log"    "testing")const (    iteration = 10000000 //Number of iterations for the benchmark test)func generateDataset() []*message.MyMessage {    var dataset []*message.MyMessage    for i := 0; i < iteration; i++ {        data := &message.MyMessage{            Email: "johndoe@example.com",            Name:  "John Doe",            Id:    int32(i),        }        dataset = append(dataset, data)    }    return dataset}func BenchmarkProtobufSerialisation(b *testing.B) {    dataset := generateDataset()    b.ResetTimer()    for n := 0; n < b.N; n++ {        for _, data := range dataset {            _, err := proto.Marshal(data)            if err != nil {                log.Fatal(err)            }        }    }}func BenchmarkJSONSerialization(b *testing.B) {    dataset := generateDataset()    b.ResetTimer()    for n := 0; n < b.N; n++ {        for _, data := range dataset {            _, err := json.Marshal(data)            if err != nil {                log.Fatal(err)            }        }    }}func main() {    // Run the benchmark tests    testing.Benchmark(BenchmarkProtobufSerialisation)    testing.Benchmark(BenchmarkJSONSerialization)}

根據(jù)基準(zhǔn)測試結(jié)果(如下所示),很明顯,就速度而言,Protocol Buffers(Protobuf)的序列化性能優(yōu)于 JSON。與 JSON 的序列化基準(zhǔn)測試相比,Protobuf 的序列化基準(zhǔn)測試完成時間明顯較短。LrR28資訊網(wǎng)——每日最新資訊28at.com

LrR28資訊網(wǎng)——每日最新資訊28at.com

內(nèi)存性能比較:JSON vs. Protocol Buffers

在 Golang 中實現(xiàn)一個基準(zhǔn)測試,比較使用 Protocol Buffers 和 JSON 處理大型數(shù)據(jù)集時的內(nèi)存使用情況:LrR28資訊網(wǎng)——每日最新資訊28at.com

package mainimport (    "encoding/json"    "github.com/golang/protobuf/proto"    "go-protobuf/model/message"    "log"    "runtime"    "runtime/debug"    "testing")const (    iteration = 100000000 //Number of iterations for the benchmark test)func generateDataset() []*message.MyMessage {    var dataset []*message.MyMessage    for i := 0; i < iteration; i++ {        data := &message.MyMessage{            Email: "johndoe@example.com",            Name:  "John Doe",            Id:    int32(i),        }        dataset = append(dataset, data)    }    return dataset}func BenchmarkProtobufSerialisation(b *testing.B) {    dataset := generateDataset()    b.ResetTimer()    for n := 0; n < b.N; n++ {        for _, data := range dataset {            _, err := proto.Marshal(data)            if err != nil {                log.Fatal(err)            }        }    }    measureMemoryUsage(b)}func BenchmarkJSONSerialization(b *testing.B) {    dataset := generateDataset()    b.ResetTimer()    for n := 0; n < b.N; n++ {        for _, data := range dataset {            _, err := json.Marshal(data)            if err != nil {                log.Fatal(err)            }        }    }    measureMemoryUsage(b)}func measureMemoryUsage(b *testing.B) {    debug.FreeOSMemory()    var mem runtime.MemStats    runtime.GC()    runtime.ReadMemStats(&mem)    b.ReportMetric(float64(mem.Alloc)/1024/1024, "Memory_MB")}func main() {    // Run the benchmark tests    testing.Benchmark(BenchmarkProtobufSerialisation)    testing.Benchmark(BenchmarkJSONSerialization)}

盡管差異很小,但基準(zhǔn)測試結(jié)果表明,與 Protobuf 序列化相比,JSON 序列化使用了更多的內(nèi)存。平均而言,JSON 序列化消耗了約 0.2052 MB 的內(nèi)存,而 Protobuf 序列化僅使用了約 0.2042 MB。盡管差異很小,但很明顯 Protobuf 在內(nèi)存使用方面更加高效。這意味著 Protobuf 的緊湊二進制格式有助于節(jié)省內(nèi)存,使其成為處理大型數(shù)據(jù)集和提高性能的良好選擇。LrR28資訊網(wǎng)——每日最新資訊28at.com

LrR28資訊網(wǎng)——每日最新資訊28at.com

結(jié)論

現(xiàn)在是總結(jié)的時候了!!!LrR28資訊網(wǎng)——每日最新資訊28at.com

與在 Golang 中的 JSON 序列化相比,Protocol Buffers(protobuf)展現(xiàn)出了更優(yōu)越的性能和內(nèi)存效率。借助其緊湊的二進制格式和高效的序列化機制,protobuf 提供了更小的消息大小、提升了網(wǎng)絡(luò)效率,并減少了帶寬使用。此外,其模式演進能力允許對數(shù)據(jù)模型進行無縫更新。雖然 JSON 有其優(yōu)勢,但在需要高速和高內(nèi)存效率的數(shù)據(jù)序列化場景中,protobuf 出類拔萃,實現(xiàn)了優(yōu)化的數(shù)據(jù)傳輸和改善的系統(tǒng)性能。LrR28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-34609-0.html在 Go 中使用 Protocol Buffers

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Python GUI 編程:dearpygui 和 tkinter 的對比與選擇!

下一篇: C++ extern的妙用

標(biāo)簽:
  • 熱門焦點
  • 5月安卓手機好評榜:魅族20 Pro奪冠

    性能榜和性價比榜之后,我們來看最后的安卓手機好評榜,數(shù)據(jù)來源安兔兔評測,收集時間2023年5月1日至5月31日,僅限國內(nèi)市場。第一名:魅族20 Pro好評率:97.50%不得不感慨魅族老品牌還
  • 容量越大越不壞?24萬塊硬盤故障率報告公布 這些產(chǎn)品零故障

    8月5日消息,云存儲服務(wù)商Backblaze發(fā)布了最新的硬盤故障率報告,年故障率有所上升。Backblaze發(fā)布的硬盤季度統(tǒng)計數(shù)據(jù),其中包括故障率等重要方面。這些結(jié)
  • 六大權(quán)益!華為8月服務(wù)日開啟:手機免費貼膜、維修免人工費

    8月5日消息,一年一度的華為開發(fā)者大會2023(Together)日前在松山湖拉開帷幕,與此同時,華為8月服務(wù)日也式開啟,到店可享六大專屬權(quán)益。華為用戶可在華為商城Ap
  • Rust中的高吞吐量流處理

    作者 | Noz編譯 | 王瑞平本篇文章主要介紹了Rust中流處理的概念、方法和優(yōu)化。作者不僅介紹了流處理的基本概念以及Rust中常用的流處理庫,還使用這些庫實現(xiàn)了一個流處理程序
  • Golang 中的 io 包詳解:組合接口

    io.ReadWriter// ReadWriter is the interface that groups the basic Read and Write methods.type ReadWriter interface { Reader Writer}是對Reader和Writer接口的組合,
  • 如何正確使用:Has和:Nth-Last-Child

    我們可以用CSS檢查,以了解一組元素的數(shù)量是否小于或等于一個數(shù)字。例如,一個擁有三個或更多子項的grid。你可能會想,為什么需要這樣做呢?在某些情況下,一個組件或一個布局可能會
  • 之家push系統(tǒng)迭代之路

    前言在這個信息爆炸的互聯(lián)網(wǎng)時代,能夠及時準(zhǔn)確獲取信息是當(dāng)今社會要解決的關(guān)鍵問題之一。隨著之家用戶體量和內(nèi)容規(guī)模的不斷增大,傳統(tǒng)的靠"主動拉"獲取信息的方式已不能滿足用
  • JVM優(yōu)化:實戰(zhàn)OutOfMemoryError異常

    一、Java堆溢出堆內(nèi)存中主要存放對象、數(shù)組等,只要不斷地創(chuàng)建這些對象,并且保證 GC Roots 到對象之間有可達路徑來避免垃 圾收集回收機制清除這些對象,當(dāng)這些對象所占空間超過
  • 本地生活這塊肥肉,拼多多也想吃一口

    出品/壹覽商業(yè) 作者/李彥編輯/木魚拼多多也看上本地生活這塊蛋糕了。近期,拼多多在App首頁&ldquo;充值中心&rdquo;入口上線了本機生活界面。壹覽商業(yè)發(fā)現(xiàn),該界面目前主要
Top 主站蜘蛛池模板: 沂源县| 建瓯市| 霍邱县| 西峡县| 绵竹市| 新田县| 西昌市| 镇远县| 西畴县| 余干县| 三河市| 重庆市| 庆元县| 来宾市| 龙江县| 长寿区| 白水县| 昆山市| 金门县| 陆丰市| 山阳县| 海淀区| 曲沃县| 涞源县| 南皮县| 高州市| 增城市| 靖安县| 桐乡市| 成安县| 康马县| 德江县| 霞浦县| 西丰县| 宾川县| 杭州市| 万山特区| 鱼台县| 峨边| 海阳市| 鄄城县|