Y3快速和低 CPU 损耗的编解码器
Y3 是一种 YoMo Codec 的 Golang 实现,它描述了个快速和低 CPU 损耗的编解码器,专注于边缘计算和流处理。
查看 explainer 获取更多信息,了解更多与 YoMo 组合的方式。
Y3 Codec
测试
go test ./...
使用
go get -u github.com/yomorun/y3-codec-golang
编码例子
package main import ( "fmt" y3 "github.com/yomorun/y3-codec-golang" ) func main() { // if we want to repesent `var obj = &foo{ID: -1, bar: &bar{Name: "C"}}` // in Y3-Codec: // 0x81 -> node var foo = y3.NewNodePacketEncoder(0x01) // 0x02 -> foo.ID=-11 var yp1 = y3.NewPrimitivePacketEncoder(0x02) yp1.SetInt32Value(-1) foo.AddPrimitivePacket(yp1) // 0x83 -> &bar{} var bar = y3.NewNodePacketEncoder(0x03) // 0x04 -> bar.Name="C" var yp2 = y3.NewPrimitivePacketEncoder(0x04) yp2.SetStringValue("C") bar.AddPrimitivePacket(yp2) // -> foo.bar=&bar foo.AddNodePacket(bar) fmt.Printf("res=%#v", foo.Encode()) // res=[]byte{0x81, 0x08, 0x02, 0x01, 0x7F, 0x83, 0x03, 0x04, 0x01, 0x43} }
解码例子 1: 解码一个原始数据包
package main import ( "fmt" y3 "github.com/yomorun/y3-codec-golang" ) func main() { fmt.Println(">> Parsing [0x0A, 0x01, 0x7F], which like Key-Value format = 0x0A: 127") buf := []byte{0x0A, 0x01, 0x7F} res, _, err := y3.DecodePrimitivePacket(buf) v1, err := res.ToUInt32() if err != nil { panic(err) } fmt.Printf("Tag Key=[%#X], Value=%v\\n", res.SeqID(), v1) }
解码例子 2: 解码一个节点数据包
package main import ( "fmt" y3 "github.com/yomorun/y3-codec-golang" ) func main() { fmt.Println(">> Parsing [0x84, 0x06, 0x0A, 0x01, 0x7F, 0x0B, 0x01, 0x43] EQUALS JSON= 0x84: { 0x0A: -1, 0x0B: 'C' }") buf := []byte{0x84, 0x06, 0x0A, 0x01, 0x7F, 0x0B, 0x01, 0x43} res, _, err := y3.DecodeNodePacket(buf) v1 := res.PrimitivePackets[0] p1, err := v1.ToInt32() if err != nil { panic(err) } fmt.Printf("Tag Key=[%#X.%#X], Value=%v\\n", res.SeqID(), v1.SeqID(), p1) v2 := res.PrimitivePackets[1] p2, err := v2.ToUTF8String() if err != nil { panic(err) } fmt.Printf("Tag Key=[%#X.%#X], Value=%v\\n", res.SeqID(), v2.SeqID(), p2) }
性能
- 与 JSON 的性能比较: yomo-y3-stress-testing
- 与 ProtoBuffer 的性能比较:y3-protobuf-testing
评论