2016-02-22 20 views
18

私は、CrystalがRubyよりも速く、コードが似ているのはどういうものかを知りたいと思っています。短い答えは、コンパイルされている可能性があり、Rubyは解釈されますが、言語仕様についてさらに理解したいと思います。なぜCrystalがRubyより速いのですか?

答えて

31

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

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

おそらくもっと多くの理由がありますが、関連性があります。

関連する問題