9

たとえば、ランタイムが一貫して型をチェックする必要があるため、動的言語は静的言語よりも遅いですか?

4

9 に答える 9

17

他のすべての条件が同じであれば、通常、はい。

于 2010-02-04T09:54:38.870 に答える
17

まず、検討するかどうかを明確にする必要があります。

  • 動的型付けと静的型付けまたは
  • 静的にコンパイルされた言語化された言語と解釈された言語とバイトコード JIT。

通常、私たちは意味します

  • 動的言語 = 動的型付け + 実行時に解釈され、
  • 静的言語 = 静的型付け + 静的にコンパイル

、しかし、それは必要ではありません。

タイプ情報は、VM がタイプ情報なしよりも速くメッセージをディスパッチするのに役立ちますが、その違いは、単相呼び出しサイトを検出する VM での最適化によって消える傾向があります。動的呼び出しについては、この投稿の「パフォーマンスに関する考慮事項」の段落を参照してください。

コンパイル済み JIT、解釈済み JIT、バイトコード JIT の間の議論はまだ未解決です。実行時に収集される情報が多いため、コンパイルがより正確になるため、バイトコード JIT は通常のコンパイルよりも高速に実行されると主張する人もいます。詳細については、JIT に関するウィキペディアのエントリを参照してください。解釈された言語は、実際には、2 つの形式またはコンパイルのいずれよりも遅くなります。

これ以上議論することはせず、白熱した議論を開始します。私は、両者のギャップがますます小さくなる傾向があることを指摘したかっただけです。直面する可能性のあるパフォーマンスの問題は、言語や VM に関連するものではなく、設計が原因である可能性があります。

編集

数値が必要な場合は、 The Computer Language Benchmarksを参照することをお勧めします。洞察に満ちていることがわかりました。

于 2010-02-04T10:41:09.353 に答える
6

命令レベルでは、動的型付け言語の現在の実装は通常、静的型付け言語の現在の実装よりも低速です。

ただし、それはプログラムの実装が動的言語で遅くなるということを必ずしも意味するものではありません。同じプログラムが静的言語と動的言語の両方で実装されているという文書化されたケースがたくさんあり、動的実装がより高速であることが判明しています。たとえば、この研究 (PDF)では、さまざまな言語のプログラマーに同じ問題を与え、結果を比較しました。Python および Perl 実装の平均実行時間は、C++ および Java 実装の平均実行時間よりも高速でした。

これにはいくつかの理由があります。

1) 動的言語でコードをより迅速に実装できるため、最適化により多くの時間を割くことができます。

2) 高レベルのデータ構造 (マップ、セットなど) は、ほとんどの動的言語のコア部分であるため、使用される可能性が高くなります。それらは言語のコアであるため、高度に最適化される傾向があります。

3) プログラマーのスキルは、言語速度よりも重要です。経験の浅いプログラマーは、どの言語でも遅いコードを書くことができます。上記の調査では、各言語で最速の実装と最も遅い実装の間に数桁の違いがありました。

4) 多くの問題領域では、実行速度は I/O または言語の外部要因によって支配されていました。

5) アルゴリズムの選択は、言語の選択を小さくする可能性があります。本「More Programming Pearls」で、Jon Bentley は問題に対して 2 つのアルゴリズムを実装しました。もう 1 つは O(N) であり、TRS80 ホーム マイクロの BASIC で実装されました (これは 1980 年代でした)。TRS80 は、N > 5000 で Cray 1 よりも優れていました。

于 2010-02-08T13:52:41.130 に答える
3

最も重要な要素は、メソッドディスパッチアルゴリズムを検討することです。静的言語では、通常、各メソッドにインデックスが割り当てられます。ソースに表示される名前は、実際には実行時に使用されておらず、読みやすくするためにソースに含まれています。当然、Javaのような言語はそれらを保持し、リフレクションで利用できるようにしますが、メソッドを呼び出すときは使用されません。私はこの議論から反省と拘束力を省きます。これは、メソッドが呼び出されると、runtmneは単にオフセットを使用してテーブルをルックアップして呼び出すことを意味します。一方、動的言語は、関数の名前を使用してマップを検索し、その関数を呼び出します。ハッシュマップは、配列へのインデックスルックアップを使用するよりも常に遅くなります。

于 2010-02-08T12:54:54.200 に答える
3

動的言語ランタイムは、型をときどきチェックするだけで済みます。

ただし、通常はまだ低速です。

ただし、このようなパフォーマンスのギャップは攻撃可能であると主張する人々がいます。例http://steve-yegge.blogspot.com/2008/05/dynamic-languages-strike-back.html

于 2010-02-04T10:01:26.063 に答える
2

いいえ、動的言語は必ずしも静的言語よりも遅いわけではありません。

pypyおよびpsycoプロジェクトは、データ駆動型のコンパイルを備えた Python 用の JIT コンパイラの構築に関して多くの進歩を遂げてきましたつまり、頻繁に呼び出される関数の特定の一般的な引数の値に特化したバージョンを自動的にコンパイルします。C++ テンプレートのように型だけでなく、実際の引数値。引数が通常ゼロまたは None だとすると、その値用に特別にコンパイルされたバージョンの関数が存在します。

これにより、C++ コンパイラから取得するよりも高速にコンパイルされたコードが生成される可能性があります。これは実行時に実行されるため、プログラムのこの特定のインスタンスの実際の入力データに特化した最適化を検出できます。

于 2010-02-04T11:07:00.897 に答える
0

実行時にさらに多くのことを計算する必要があるため、想定するのが合理的です。

于 2010-02-04T10:00:36.093 に答える
0

実際、使用されているベンチマークの多くは代表的なものではないため、なんとも言えません。また、HotSpot JVM などのより洗練された実行環境では、違いはますます重要ではなくなります。次の記事をご覧ください。

Java の理論と実践: 動的コンパイルとパフォーマンス測定

于 2010-02-08T13:16:08.690 に答える