最も速い関数型言語


18

私は最近、特にHaskellとF#の関数型プログラミングを掘り下げてきました。いくつかのグーグルを回った後、より顕著な関数型言語(Scala、F#など)のベンチマーク比較を見つけることができませんでした。

一部の言語はハイブリッドであるため、必ずしも公平ではないことを知っています(Scalaが思い浮かびます)が、どの操作と全体でどのパフォーマンスが優れているかを知りたいだけです。


18
言語は高速でも低速でもありません、実装はそうです。
スターブルー

6
言語実装は高速でも低速でもありません。それらの言語実装を使用して実行されるプログラムは(他のプログラムと比較した場合)です。慈善活動-あるプログラミング言語が別のプログラミング言語よりも速いと話すとき、理にかなっている明白な方法は、特定の言語実装を使用して実行される特定のプログラムについて話していることを理解することです。
igouy

3
@starblue:それは非常に素直な答えであり、あまり役に立ちません。同じ言語の2つの実装を作成することは確かに可能ですが、一方は他方よりも遅いですが、そこに置く方法は、他の言語の実装で特定の非効率性を必ずしも必要とする言語設計の詳細が存在しないことを意味しますデザイン、必要ありません。そして、それは単に真実ではありません。(特にこの特定のトピックでは、関数型言語はそれらのために悪名高いです!)
メイソンウィーラー

3
@igouy「言語の実装は高速でも低速でもありません」これは事実ではありません。CPythonPyPyすぐに思い浮かぶ。
NlightNFotis

@NlightNFotis-CPythonは何秒かかりますか?PyPyは何秒かかりますか?言語の実装は高速でも低速でもありません。そのプログラムはCPythonで何秒かかりますか?
igouy

回答:


25

Great Benchmarks Gameによると、ATSはHaskell、Scala、およびCommon Lispのバリアントの1つを使用して、他のATSよりも高速であり、そのすぐ後ろに速度があります。その後、OcamlとF#はほぼ同じ速度のカテゴリになり、RacketとClojureは遅れています...

ただし、これはほとんど何も意味しません。それはすべて、問題、マシン、コンパイラ、コーディング技術、そして場合によっては平運の問題です。一般的に、Haskellのような直接機械コード化言語は、F#のようなVMコンパイル言語よりも優れており、純粋に解釈された言語よりもはるかに優れています。また、一般的に、静的型付け言語は、静的分析により、実行時ではなくコンパイル時にすべての型操作を計算できるため、動的型付けよりも高速です。繰り返しますが、これらは一般的なルールであり、常に例外があります。「パラダイム」はそれとはほとんど関係ありません。


考慮すべき多くの要因があり、すべてが完璧であったとしても、それらが異なるデータで異なるように動作する可能性があることは知っていますが、私の質問はかなり曖昧です。リンクのおかげで、本当に便利-私はATSはその速いことを知っていたことはありません
ファルーク

詳細な比較情報のある素敵なリンク。Clojureがより多くのメモリを消費し、Javaよりも大幅に時間がかかるのを見ると少しがっかりします。Clojureが同様のパフォーマンスを持っているという主張を覚えていますが、そうではないようです。
DPM

ATSのWebサイトでは、ATSはさまざまなプログラミングパラダイムをサポートしているため、ATSが他のプログラミングパラダイムよりも高速であると主張する前に、それらのプログラムが実際に機能的なスタイルで記述されていることを示す必要があります。機能的なATSが他のATSよりも速くないということだけかもしれません。
igouy

2
ScalaのWebサイトでは、Scalaはオブジェクト指向の機能的な機能を統合していると述べています。Scalaプログラムがオブジェクト指向プログラムではなく機能プログラムとして書かれていることを確認しましたか?
igouy

12

また、プログラミング言語のパフォーマンスを測定/定量化できないことも指摘しておく必要があります。最善の方法は、特定のプラットフォームで特定の言語を実装し、特定のプログラムを実行してパフォーマンスを測定することです。

したがって、「最速の関数型言語」について尋ねるとき、あなたは言語の現在の実装の最高について本当に求めているものです。


@igouyのコメントは、言語の実装には他のパフォーマンス指標があるという点を指摘しています。たとえば、コンパイル時間。しかし、それはアプリケーションプログラムのランタイムが言語の実装の(間接的な)尺度であり、言語自体の尺度ではないという事実を変えません。

たとえば、Javaを検討してください。クラシック(Java 1.0)Javaの言語機能のみを使用して、シングルスレッドベンチマークを作成するとします。JDK 1.0を使用してコンパイルおよび実行すると、パフォーマンスが低下します(「cos JDK 1.0にはネイティブコードコンパイラがありませんでした」)。JDK 1.1から... JDK 1.7に進むと、次第に良い結果が得られるでしょう。しかし、これはJava 言語の変更によるものではありません...私のベンチマークは同じ言語のサブセットを使用しているためです。むしろ、高速化は、コンパイラ、ランタイムシステム、クラスライブラリの実装の改善によるものです。これらはすべて実装の問題です。

もう1つの点は、これらの実装の違いは、同じ言語に対して非常に重要(たとえば桁違い)になる可能性があることです。したがって、言語Xの最適な実装が言語Yの最適な(または唯一の)実装よりも高速であるという事実は、必ずしも言語自体について多くを語るわけではありません。


できることは、特定のプログラムのパフォーマンスを測定することです。言語実装のパフォーマンスを測定するとき、プログラムの実行にかかる時間ではなく、プログラムのコンパイルにかかる時間を調べる必要があります。
igouy

プログラムの実行時間は、その特定のハードウェアなどで特定の言語実装を使用して実行される場合、その特定のプログラムのプロパティです。プログラムの実行時間が言語のプロパティではない場合、このコンテキストで言語名を許可することは慈善ですは、通常のよく知られている言語実装の省略形として使用されています。
igouy

@igouy-それは本当です。しかし、多くの人々は、「Javaは遅い。残念ながら、このナンセンスは文字通り全世代のプログラマーによって読まれた」と宣言する多くの古いウェブサイトによって示されるように区別しません。私はここでは、このポイントを作っています理由です。
スティーブンC

「言語の実装の(間接的な)措置」 - -あなたが言うする自由を持つようにしたいよう他の誰かが言って自由であるべきではない理由を説明して下さい- 言語の(間接的な)対策を
igouy

@igouy-1)好きなことを自由に言うことができます。しかし、それはあなたを正しくしません。2)言語の唯一の実装ががらくたである場合を考えます。ベンチマークします。その後、実装を更新してベンチマークを実行すると、パフォーマンスが劇的に向上しました。それは言語のパフォーマンスが改善されたことを意味しますか?言語が変更されていないことを考えると、それはどういう意味ですか?
スティーブンC 14年

6

実行速度のみで言語を見ている場合、いくつかの主要な点が欠けています。速度は良いことですが、それだけではありません。

Haskellは、非常に堅牢な型システムを使用して、バグがなく堅牢なプログラムを作成します。

Erlangは組み込みの監視システムを使用して、さまざまな種類の障害に直面した場合に非常に高いレベルの信頼性を提供できる障害システムを作成できるようにします。さらに、Erlangは、他の言語では一致しにくいレベルの並行性を提供できます。

実際、現代の実行速度は、ほとんどの場合に考慮すべき項目のリストよりもはるかに低いと考えています。(大規模な数値計算を行っている場合は、速度のためにおそらくfortranを使用したいと思いますが、それ以外は重要ではありません)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.