sci

最果て風呂

Node.js の実行環境は速くなっている?

この記事に関連するような、しないような話です。

入力するテキストに比例して計算量が増えていくため、技術的に見るべき点が何も無い自作スクリプト。今までは Python3 が一番速いなぁと思っていたのですけれど、ベンチマークを回すスクリプトを作成してあらためて見てみると、JavaScript (Node.js) と C# (Mono) が頑張っているように見えます。

テストはあまり厳密なものではなく、ディレクトリから適当にファイルを選んでぞれぞれのスクリプトtime を使って計測しました。

実はこの結果に大きな影響を与える事項がひとつありまして、C と C++PHP(確か) は読み込んだファイルを一行ずつ処理しているため、計算量が増大しています。結果、遅くなっている訳ですね。他のものと同じようにファイルを一括で処理するようにすれば良いのですけれど、調べるのが面倒なので……。

16KB 204KB 1.4MB 2.6MB 3.4MB
Python3: 0.08 0.29 1.77 5.36 4.45
Perl5: 0.09 0.49 3.58 6.71 8.58
PHP7: 0.14 1.08 9.33 23.57 25.09
Ruby: 0.16 1.38 10.56 16.84 23.78
Node.js: 0.08 0.18 1.13 2.55 2.87
Mono: 0.13 0.40 2.41 6.38 6.00
C: 0.12 1.49 10.16 17.32 25.40
CC: 0.11 1.24 8.62 14.05 21.74
Go: 0.18 0.63 3.97 7.87 10.35

f:id:nakinor:20170619194614p:plain (コピペミスで一部数値の間違いがありましたのでグラフと共に修正しました)

グラフにしてみると比例していますね。しかしこれ、ファイルを一括で処理する方式にしている Ruby の立場がありません(>_<)。いちばん好きなんですけどね。あと、Go はもう少し速くなって欲しいです。

実際は 100KB 程度のファイルしか扱わないので、どの言語を使っても問題ないわけなのですけれども……

追記

PHPスクリプトで fopen() + fgets() を使っている部分を file_get_contents() に変更して、ファイルを一気に読み込んで処理するようにしてみました。あらためて計測してみると……

16KB 204KB 1.4MB 2.6MB 3.4MB
Node.js: 0.08 0.19 1.09 3.26 2.66
Python3: 0.07 0.28 1.78 5.41 4.57
Mono: 0.13 0.40 2.38 7.40 5.50
Perl5: 0.09 0.50 3.46 6.62 8.64
Go: 0.16 0.63 3.96 6.93 10.17
PHP7: 0.08 0.87 5.56 9.23 13.73
CC: 0.11 1.24 8.56 14.13 21.53
Ruby: 0.15 1.41 10.48 16.69 23.42
C: 0.12 1.50 10.03 17.38 25.07

f:id:nakinor:20170619194632p:plain

だいぶ PHP の速度が改善しました。それにしても Node.js, Python3, Mono のグラフの動きが変ですね?そして、C や C++ が遅いというのも、いかにアルゴリズムが大切かということがわかる実例になっています。