24

コードは非常に似ていますが、Crystal が Ruby よりも正確に高速である理由を知りたいです。簡単に言えば、それはコンパイルされており、Ruby は解釈されているということかもしれませんが、言語仕様についてもっと理解したいと思っています。

4

1 に答える 1

45

私はそれが物事の組み合わせだと思います:

  • Ruby はインタープリターであり、インタープリターは改善される可能性があります。たとえば、JS や Java などの他のインタープリター言語には、非常に優れた VM および JIT コンパイラーがあります。
  • Crystal で実行時に行われる多くの Ruby チェックは、コンパイル時に行われます。たとえば、Ruby での単純なメソッド呼び出しは、メソッド ルックアップで終了します。キャッシュがあっても、ネイティブ関数呼び出しに勝るものはありません。または、Ruby が引数の型に基づいて異なることを行うと決定した場合、これらのチェックは実行時に行われます。Crystal では、それらはコンパイル時に認識されるため、これらのチェックは表示されなくなります。これらのチェックがなければ、コンパイラは呼び出しをインライン化し、かなりクレイジーなことを行うことができます (LLVM のおかげです)。または、たとえば、インスタンス変数のルックアップは、(私の知る限り) Ruby ではハッシュ ルックアップですが、Crystal では単なるメモリの間接化とロードです。
  • Crystal では、余分なメモリ割り当てを回避しようとします。たとえばto_s(io)、オブジェクトをメモリ内の文字列に変換する代わりに、IO に書き込みます。または、スタックに割り当てられた固定サイズの配列のタプルがあります。または、型を構造体として宣言して、ヒープ割り当てを回避できます。
  • C への呼び出しは、ラッパーなしで直接行われます。ラッパーを使用することもできますが、それは LLVM によってインライン化されます。Ruby では、常に最初に Ruby メソッドを解決する必要があります。

おそらくもっと多くの理由がありますが、それらは関連しています。

于 2016-02-22T14:56:08.197 に答える