Bidirectional Streaming VS Unary RPCs
Noahです
以前のハッカソンでgRPCを触ったのですが、時間差ファーストといいつつ、Bidirectional Streamingを使っていなかったので、それについて調査してみた。
Bidirectional Streamingについては下をチェケラ
簡単に言うと双方向ストリーミングですね.
ベンチ用コード
以下のように書きました
protobufは以下のような感じです. リクエストやレスポンスに特に意味はないです. Emptyよりは少しデータ量が欲しかっただけですね.
syntax = "proto3"; package bench_man; message Nesting { string text = 1; int64 index = 2; } message BenchRequest { string text = 1; int64 index = 2; Nesting n = 3; } message BenchResponse { string text = 1; int64 index = 2; Nesting n = 3; } service BenchService { rpc UnaryBench(BenchRequest) returns(BenchResponse); rpc BidirectionalStreamBench(stream BenchRequest) returns(stream BenchResponse); }
実行結果
% go test -bench . -benchmem goos: darwin goarch: amd64 pkg: github.com/NoahOrberg/bench_man BenchmarkBidirectionalStream-4 20000 85403 ns/op 1776 B/op 54 allocs/op BenchmarkUnaryRPC-4 10000 145166 ns/op 9840 B/op 183 allocs/op PASS ok github.com/NoahOrberg/bench_man 4.084s
まぁ、それはそうという結果ですね. オペレーション辺りの実行時間は倍とまでは言いませんが爆速、メモリも見てみましたがオペレーション辺りのアロケーション回数や使用バイト数も断然良さげです.
概念としてこっちのほうがいいというのはよく知っているのですが、改めてベンチマークを取ると目に見えて結果がわかるのでいいですね.