Couchbase 同期・非同期 insert(upsert)のパフォーマンス比較
Couchbase Java SDK を使用して、10万件のデータをインサートする場合のパフォーマンスを比較しました。
通常は同期処理にてインサートが行われますが、非同期用のAPIも用意されていましたので、それの比較となります。
Couchbase server は Docker で生成したもので、ノード数は1つだけです。
1.10万ループ内で1件ずつ insert(upsert) する場合(同期)
protected void bigPut() { // data preparation stopWatch.start(); IntStream.range(0, 100000).forEach(i -> { JsonObject user = JsonObject.empty() .put("firstname", "Walter") .put("lastname", "White") .put("job", "chemistry teacher") .put("age", i); JsonDocument doc = JsonDocument.create("walter:" + i, user); bucket.upsert(doc); }); stopWatch.stop(); System.out.println(stopWatch); stopWatch.reset(); // disconnection cluster.disconnect(); }
2. 10万件のリストを作成し、そのリストを非同期で insert(upsert)した場合
protected void bulkPut(){ stopWatch.start(); List<JsonDocument> jsons = new ArrayList<>(); IntStream.range(0, 100000).forEach(i -> { JsonObject user = JsonObject.empty() .put("firstname", "Walter") .put("lastname", "White") .put("job", "chemistry teacher") .put("age", i); JsonDocument doc = JsonDocument.create("walter:" + i, user); jsons.add(doc); }); Observable .from(jsons) .flatMap(new Func1<JsonDocument, Observable<JsonDocument>>() { @Override public Observable<JsonDocument> call(final JsonDocument docToInsert) { return bucket.async().upsert(docToInsert); } }) .last() .toBlocking() .single(); stopWatch.stop(); System.out.println(stopWatch); stopWatch.reset(); // disconnection cluster.disconnect(); }
一般的に非同期処理の方が速く処理されるのは想像しやすいところです。
ただ、2に関しては、10万件のリストを作成してから、更にそのリストからドキュメントを取り出すような処理を行うため、1周多めにループ処理を行うことになります。
しかし、その時間込みで計測を行いました。
結果(3回計測)
1.10万ループ内で1件ずつ insert(upsert) する場合(同期)
00:00:58.620
00:01:00.178
00:00:53.739
2. 10万件のリストを作成し、そのリストを非同期で insert(upsert)した場合
00:00:36.464
00:00:35.964
00:00:48.657
それでもやはり、非同期処理の方がトータルで速いという結果になりました。
10万件を同時に処理したとは言え、正直なところ、想像していたよりも差が大きい印象です。