お知らせ
この記事へのフィードバックを受けて、以下に更新版「プログラミング言語の実行速度比較(2023/5)」を公開しています。コメントをお寄せくださった皆様ありがとうございます。はじめに
2019年に「言語間の速度比較」という記事を投稿した。 それから4年近く経過したので、それぞれの言語の最新版で再度検証する。また、サポートが終了したPython2の代わりに近年人気が高いRustを追加する。さらにC言語で算出した素数の格納をrealloc()で確保した領域にする評価も追加した。評価には、シングルスレッドで順次既知の素数で割ることで1億までの素数を求めるプログラムを使用(ソースはここ)言語 | 時間 (sec) | 最大使用物理メモリ(MiB) | 算出素数格納コンテナ | 補足情報 | 感想 |
---|---|---|---|---|---|
C | 12.6 | 25.1 | 固定長配列 | gcc 12.2.0 最適化-O3 |
- |
C | 12.6 | 23.9 | realloc() | gcc 12.2.0 最適化-O3 |
固定長配列よりメモリ使用量が少ないが、処理時間は同じ。ある程度、数が大きくなると新しい素数の追加が少なくなるからか。 |
C++ | 66.5 | 36.5 | std::vector | gcc 12.2.0 最適化なし(-O0でビルド) |
- |
C++ | 12.7 | 35.6 | std::vector | gcc 12.2.0 最適化(-O3でビルド) |
最適化するとやはりかなり速くなる。メモリ使用量もC言語とRust以外の言語と比べて圧倒的に少ない |
Rust | 14.2 | 23.9 | Vec | 1.63.0 | C++に匹敵する速さ。メモリ消費はむしろ少ない。それでいて安全性が高いとくれば次世代の主役の可能性あり |
JAVA | 19.5 | 228.9 | ArrayList | OpenJDK 17.0.6 | C/C++の約1.5倍の実行時間。これまでの経験ともだいたい整合する |
Kotlin | 19.6 | 256.2 | List | Kotlin 1.8.20 | Javaと同等。コードの書きやすさを考えると悪くない選択肢 |
Scala | 24.9 | 1078.4 | mutable.ArrayBuffer | Scala 3.2.2 | 速度面ではJavaと比較してやや劣る程度だが、メモリ使用量がJavaの約4倍、C++の30倍近い。 |
Golang | 48.9 | 168.1 | slice | go1.19.6 | 予想より速くない。メモリ使用量もJavaの半分程度で、この結果だけだと使いみちが中途半端となるかも。 |
Node.js | 17.3 | 196.1 | Array | v18.13.0 | JavaやScalaを凌駕。メモリ使用量もそれらよりやや少ない。 |
PHP | 109.5 | 149.4 | array | PHP 8.2.2 | 特に良いところもないような。無理に使うような言語ではないと思う。 |
Python3 | 289.4 | 231.5 | list | 3.11.2 | 圧倒的に遅い。メモリ使用量は他のスクリプトと同程度。直接アルゴリズムを組んでごりごりやる言語ではない。今回の評価観点は一番不向きな用途だろう。 |
評価環境
- Intel Core i7 8559U (2.7GHz)
- DDR4 2400MHz 32GiB
- Debian 12 (sid)
4 件のコメント:
こんにちは、興味深い記事をありがとうございます。
Javaと比べてScalaがかなりメモリを食っているのが気になりました。普段Scalaで開発しているのですが、このようなことは珍しいなと思いました。
ScalaでもJava同様のOpenJDK 17.0.6で動作させていますか?また、JVMのGCアルゴリズムは何を指定していますか?
-- @windymelt
@windymelt@plrm.capslock.dev or Twitter @windymelt
コメントありがとうございます。
> ScalaでもJava同様のOpenJDK 17.0.6で動作させていますか?また、JVMのGCアルゴリズムは何を指定していますか?
はい、JAVAと同じく17.0.6です。GCはあまり意識してなくてオプションを指定せずにJVM実行しました(デフォルトはG1GCですかね)。興味深い観点なので、いくつかGCのオプションを変えて実行してみました。SerialGCだと、実行速度もそれほど変わらず、Max RSSは350MiBぐらいいなりました。そもそもヒープとか指定するとまた変わってくるのかもしれません。実行環境にはメモリが32GiB搭載されています。
Commnad : java -XX:+UseSerialGC Main -u 100000000
Real time: 26.28 sec
Max RSS : 358828 KiB
Commnad : java -XX:+UseParallelGC Main -u 100000000
Real time: 25.88 sec
Max RSS : 2299740 KiB
Commnad : java -XX:+UseG1GC Main -u 100000000
Real time: 24.80 sec
Max RSS : 1106836 KiB
お返事ありがとうございます。こちらでも色々検証してみましたので、ブログにしました。
https://blog.3qe.us/entry/2023/04/21/041246
もしよければ御笑覧ください。
できれば RubyとJavascript のテストもして欲しかったです
コメントを投稿