LoginSignup
14
12

More than 5 years have passed since last update.

embulk で pure java と jruby でプラグインを作ったときの速度比較

Last updated at Posted at 2015-06-23

Embulk のプラグインを作るにあたって、pure java と jruby でどれぐらい速度差が出るのか気になったので、それぞれ同じ動作をする簡単なプラグインを作って速度比較してみた。

このプラグインは、入力データをそのまま通すだけの 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 の実行

random.yml
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 の実行

example.yml
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 プラグインとかだと書き込みのほうが遅いのであまり気にならないかも。

ruby オブジェクトへの変換で遅くなるとのこと。cf. https://twitter.com/sonots/status/613149071830745088

14
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
12