Clojure vs Java速度比較

twitterで「ClojureはJavaより遅いから…」とつぶやいたら複数人に「どんなケースか?」のような質問を受けて驚いた。実はちょっとうれしくて、僕としてもClojureが本当に速いならそれに越したことはない。

少しincanterを使ってデータをいじっている感覚だと、メモリ上に載せた数十万行〜100万行くらいのデータについて処理している感じでもJavaよりもっさりした感覚があった。

元々STMが遅かったのが強烈な印象だったのだが、普通にでかいファイルを処理する際にはClojureはどの程度速いのか測ってみることにした。

テスト内容は超シンプルに、100万行のCSVファイルの1カラム目の最大値を求める、というもの。コードは以下。

https://github.com/Kanatoko/cljbench/

Clojureのコードを書くのが数年ぶりなのでインデントとかよくわからなくてキモいコードですみません。何か致命的なミスをしている気もするがとりあえず動いている。

速度を比較した感じ、Clojureで10かかるところがJavaだと4で終わる感じ。60%速い。

2017/12/4 06:55追記

今回は「普段使い」のパフォーマンス的な比較をしたいので、2つのコードとも「なるべく深く考えずに、とりあえず書く状態」を目指している。カリカリに速くした状態ではない。

例えばJava側だったらsplit(正規表現なので遅い)を避けてカンマの位置をindexOfで求めに行く方がずっと速くなると思うが(業務でやっているのサーバのパフォーマンスチューニングはそんなのばっかり)、何をやってるのかわかりにくくなるし、最初のカラムではなく別のカラムを求める場合にコードの変更点が増えるので。でももしかしたらsplitは単純なケースだと速いかも。

Clojure側はできるだけClojureらしいコードにしたい。ClojureのコードにBufferedInputStream…とかJavaのクラスがなるべく出てこないようにしたい。

2017/12/4 07:55追記

添削して頂いたらJava版より1〜2割程度遅いくらいまで速くなった。これだと「Clojureは遅い」という評価は当てはまらない。充分に速いと言える。素晴らしい。

このチューニングが具体的にやっているのは「Javaの関数を直接使うようにした」という点なのが微妙(Clojureの関数とJavaの関数が入り乱れてキモいコードになる)だと感じたが、Clojureの哲学としては「Javaを歓迎」して良いはずなのでこれに慣れていけばいいだけか。

あやぴさんありがとうございました。

 

Advertisements


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

w

Connecting to %s