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