Embulk のプラグインを作るにあたって、pure java と jruby でどれぐらい速度差が出るのか気になったので、それぞれ同じ動作をする簡単なプラグインを作って速度比較してみた。
- java版 https://github.com/sonots/embulk-filter-java_pass
- ruby版 https://github.com/sonots/embulk-filter-ruby_pass
このプラグインは、入力データをそのまま通すだけの filter プラグインで、ruby 実装だととても単純で、ただ入力を page_builder に add するだけになっている。
def add(page)
page.each do |record|
@page_builder.add(record)
end
end
Java 版だと型があるので、Visitor を使ってもう少しごにょごにょしているが、いずれにせよやっていることは加工もなにもせずに通すだけである。
実行
これをそれぞれ 100,000 件のデータに対して通してみた。データは embulk-input-random であらかじめ生成しておいたものをファイルから読み込んで実験した。
random の実行
in:
type: random
rows: 100000
schema:
id: primary_key
name: string
score: integer
out:
type: file
path_prefix: ./sample
file_ext: .csv
formatter:
type: csv
header_line: true
charset: UTF-8
newline: CRLF
$ embulk gem install embulk-input-random
$ embulk run random.yml
java_pass の実行
in:
type: file
path_prefix: sample.000.00
parser:
charset: UTF-8
newline: CRLF
type: csv
delimiter: ','
quote: '"'
escape: ''
null_string: 'NULL'
header_line: false
columns:
- {name: id, type: long}
- {name: name, type: string}
- {name: score, type: long}
filters:
- type: java_pass
out:
type: "null"
$ ./gradlew gem
$ embulk run -I lib example.yml
結果
経過時間 | |
---|---|
java | 0.924 sec |
ruby | 3.078 sec |
圧倒的に pure java のほうが速いようだ。個人的には ruby のほうが得意なのだが、filter プラグインは java で書いた方がよさそう。output プラグインとかだと書き込みのほうが遅いのであまり気にならないかも。
@sonots pure javaの方がずっと速いですね。jrubyだとオブジェクトの変換がどうしても遅い。
— FURUHASHI Sadayuki (@frsyuki) 2015, 6月 23
ruby オブジェクトへの変換で遅くなるとのこと。cf. https://twitter.com/sonots/status/613149071830745088