NoahOrblog

某・福島にある大学のコンピュータ理工学部の大学生のお話。

Bidirectional Streaming VS Unary RPCs

Noahです

以前のハッカソンでgRPCを触ったのですが、時間差ファーストといいつつ、Bidirectional Streamingを使っていなかったので、それについて調査してみた。

Bidirectional Streamingについては下をチェケラ

grpc.io

簡単に言うと双方向ストリーミングですね.

ベンチ用コード

以下のように書きました

gist.github.com

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

まぁ、それはそうという結果ですね. オペレーション辺りの実行時間は倍とまでは言いませんが爆速、メモリも見てみましたがオペレーション辺りのアロケーション回数や使用バイト数も断然良さげです.

概念としてこっちのほうがいいというのはよく知っているのですが、改めてベンチマークを取ると目に見えて結果がわかるのでいいですね.