OCamlは速いのか?

正直なところ、プログラミング言語自体がどれほどの速度が出るかどうかという話題はナンセンスだと思います。
やろうとしている内容によって全く異なる結果になりますし、私が主にターゲットとしているWebアプリケーションとなるとデータソース間とのやり取りなどが実行速度の大部分を占めることになってきます。

とはいえ、やはりシンプルに実装した場合どれだけの速度が出るのか、と気になってしまうのが人情。
Apache Groovy/Grailsと比べて、OCaml/Opiumの速度ってどれぐらい違いが出るのか試してみました。

前提条件

双方で、同じDBの同じテーブルの一覧をJSONにして返す(テーブルのJOIN無し)というAPIを用意してそれをテストしました。

データベースはPostgreSQLで、テーブルは以下のような構造です。

                                        Table "public.tags"
   Column   |            Type             | Collation | Nullable |             Default              
------------+-----------------------------+-----------+----------+----------------------------------
 id         | bigint                   |           | not null | nextval('tags_id_seq'::regclass)
 name       | text                     |           |         | 
 created_at | timestamp without time zone |           | not null | now()
 updated_at | timestamp without time zone |           | not null | now()
Indexes:
    "tags_pkey" PRIMARY KEY, btree (id)
    "tags_name_key" UNIQUE CONSTRAINT, btree (name)

このテーブル内の全レコードを取得してJSONにして返すAPIを用意してabでテストしました。

総アクセス数は1000、同時アクセス数は100としました。(ab -n 10000 -c 100

結果

Apache Groovy/Grails

項目 1回目 2回目 3回目 4回目 5回目
Time taken for tests (seconds) 0.180 0.164 0.171 0.166 0.149
Requests per second [#/sec] (mean) 5558.52 6099.87 5848.40 6027.29 6695.55

OCaml/Opium

項目 1回目 2回目 3回目 4回目 5回目
Time taken for tests (seconds) 0.501 0.493 0.487 0.470 0.490
Requests per second [#/sec] (mean) 1997.24 2029.21 2053.82 2127.47 2040.50

まとめ

Apache Groovy / Grailsの組み合わせのほうが、OCaml / Oopimよりも約3倍ほど速い、という結果になりました。

とは言え、最初に述べた通り、プログラミング言語自体の速度を比較することはナンセンスですし、さらに複数の要素が絡むWebアプリケーションでは単純比較はできません。

Grailsはフルスタックなフレームワークで裏で多くの優秀なキャッシュ機構が動いています。
OpiumはOCaml用のSinatraライクなシンプルなWebフレームワークなので、そういったキャッシュ機構などは付属していません。

また、OCamlの方ではブロッキングなログの出力をしてましたし、PostgreSQLドライバのocaml-caqti(実はラッパで本当のドライバはpostgresql-ocaml)が利用しているPtimeがかなり遅い、ということが分かっています。

さらに、Apache Groovy / GrailsはJVMで動いているので、検証環境のCPUコア(8個)をすべて使い切った結果です。
OCamlはCPUコアを一個しか使わないので、乱暴な言い方をすると本来はJVMの方がOCamlより8倍ほど早くなってもおかしくないはずです。
それが3倍程度の差しか出なかったので、1コア単位で見るとOCaml/Opiumの方が速度が出ているのでは、とも言えるかもしれません。

が、実際問題アプリケーションを運用する上で、何も考えずに実行速度を担保しつつ簡単にしっかりWebアプリケーションを作成したい、ということであればApache Groov/Grailsの方に軍配が上がる結果となりました。

とはいえOCaml/Opiumはまだまだチューニングのしがいが有りますし、何より型安全な関数型プログラミングが出来ると言ったメリットは見逃せません。
引き続き、OCamlの学習と実戦投入を続けていく予定です。