プログラミング言語の実行速度比較(2023/4)

お知らせ

この記事へのフィードバックを受けて、以下に更新版「プログラミング言語の実行速度比較(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 件のコメント:

Unknown さんのコメント...

こんにちは、興味深い記事をありがとうございます。
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

windymelt さんのコメント...

お返事ありがとうございます。こちらでも色々検証してみましたので、ブログにしました。

https://blog.3qe.us/entry/2023/04/21/041246

もしよければ御笑覧ください。

匿名 さんのコメント...

できれば RubyとJavascript のテストもして欲しかったです