https://github.com/cloudwego/fastpb
A faster Protobuf serializer & deserializer.
https://github.com/cloudwego/fastpb
deserializer serializer
Last synced: 3 months ago
JSON representation
A faster Protobuf serializer & deserializer.
- Host: GitHub
- URL: https://github.com/cloudwego/fastpb
- Owner: cloudwego
- License: apache-2.0
- Created: 2022-07-13T12:05:48.000Z (almost 3 years ago)
- Default Branch: main
- Last Pushed: 2024-08-19T23:28:40.000Z (10 months ago)
- Last Synced: 2025-03-28T09:05:38.972Z (3 months ago)
- Topics: deserializer, serializer
- Language: Go
- Homepage:
- Size: 107 KB
- Stars: 91
- Watchers: 11
- Forks: 9
- Open Issues: 8
-
Metadata Files:
- Readme: README.md
- Contributing: CONTRIBUTING.md
- License: LICENSE
- Code of conduct: CODE_OF_CONDUCT.md
- Codeowners: .github/CODEOWNERS
Awesome Lists containing this project
README
# Fastpb
A faster Protobuf serializer & deserializer.
**Attention**
* only proto3 is supported now.
* known-types(any, api, duration...) is not supported now.## Install
```shell
go install github.com/cloudwego/fastpb/protoc-gen-fastpb@latest
```## Usage
Refer to [examples][examples], use in two steps:
1. use fastpb to generate code. ([refer here][gen_sh])
2. use fastpb API to marshal/unmarshal. ([refer here][demo])### Step 1: Generate Code
Using the command line tool to generate code:
```shell
protoc --go_out=. \
--fastpb_out=. \
${your_idl}.protoor
protoc --go_opt=paths=source_relative --go_out=. \
--fastpb_opt=paths=source_relative --fastpb_out=. \
${your_idl}.proto
```### Step 2: Codec Message
Encoding and Decoding must use fastpb's API, shown as [demo][demo]:
```go
package examplesimport (
"github.com/cloudwego/fastpb"
)// Marshal .
func Marshal(msg fastpb.Writer) []byte {
// TODO: buffer can be reused.
buf := make([]byte, msg.Size())msg.FastWrite(buf)
return buf
}// Unmarshal .
func Unmarshal(buf []byte, msg fastpb.Reader) error {
_, err := fastpb.ReadMessage(buf, int8(fastpb.SkipTypeCheck), msg)
return err
}
```## Performance
```
goos: linux
goarch: amd64
pkg: github.com/cloudwego/fastpb/benchmark
cpu: Intel(R) Xeon(R) Gold 5118 CPU @ 2.30GHz
```Benchmarks have compared [golang/protobuf][golang] (referred to as `_golang`) and [fastpb][fastpb] here.
### Marshal
Benchmark_marshal_number_golang-48 375.2 ns/op ~ 96 B/op ~ 1 allocs/op
Benchmark_marshal_number_fastpb-48 145.7 ns/op -61.17% 0 B/op -100.00% 0 allocs/op
Benchmark_marshal_string_golang-48 1010 ns/op ~ 2304 B/op ~ 1 allocs/op
Benchmark_marshal_string_fastpb-48 58.57 ns/op -94.20% 0 B/op -100.00% 0 allocs/op
Benchmark_marshal_list_golang-48 8788 ns/op ~ 18432 B/op ~ 1 allocs/op
Benchmark_marshal_list_fastpb-48 3430 ns/op -60.97% 0 B/op -100.00% 0 allocs/op
Benchmark_marshal_map_golang-48 43497 ns/op ~ 21680 B/op ~ 393 allocs/op
Benchmark_marshal_map_fastpb-48 5951 ns/op -86.32% 0 B/op -100.00% 0 allocs/op### Unmarshal
Benchmark_unmarshal_number_golang-48 497.1 ns/op ~ 144 B/op 1 allocs/op
Benchmark_unmarshal_number_fastpb-48 431.6 ns/op -13.18% 144 B/op 1 allocs/op
Benchmark_unmarshal_string_golang-48 939.7 ns/op ~ 2128 B/op 3 allocs/op
Benchmark_unmarshal_string_fastpb-48 668.4 ns/op -28.87% 2128 B/op 3 allocs/op
Benchmark_unmarshal_list_golang-48 12527 ns/op ~ 20296 B/op 99 allocs/op
Benchmark_unmarshal_list_fastpb-48 12593 ns/op +0.53% 20296 B/op 99 allocs/op
Benchmark_unmarshal_map_golang-48 49868 ns/op ~ 24226 B/op 426 allocs/op
Benchmark_unmarshal_map_fastpb-48 21213 ns/op -57.46% 21467 B/op 61 allocs/op[fastpb]: https://github.com/cloudwego/fastpb
[examples]: https://github.com/cloudwego/fastpb/tree/main/examples
[demo]: https://github.com/cloudwego/fastpb/blob/main/examples/demo.go
[gen_sh]: https://github.com/cloudwego/fastpb/blob/main/examples/gen_code.sh
[golang]: https://github.com/golang/protobuf