2016-02-22 11 views
18

Ich würde sehr gerne wissen, was genau Crystal schneller als Ruby macht, während Code so ähnlich ist. Die kurze Antwort könnte sein, dass es kompiliert ist und Ruby interpretiert wird, aber ich würde gerne mehr über die Sprachspezifikationen erfahren.Warum ist Crystal schneller als Ruby?

Antwort

31

Ich denke, es ist eine Kombination von Dingen:

  • Rubin interpretiert wird, und der Dolmetscher verbessert werden könnte. Zum Beispiel haben andere interpretierte Sprachen wie JS oder Java einen sehr guten VM und JIT Compiler.
  • Viele Ruby-Prüfungen, die zur Laufzeit in Crystal durchgeführt werden, werden zur Kompilierzeit ausgeführt. Zum Beispiel endet ein einfacher Methodenaufruf in Ruby in einer Methodensuche. Selbst mit einem Cache wird es einen nativen Funktionsaufruf nicht schlagen. Oder wenn Ruby aufgrund des Argumenttyps unterschiedliche Aktionen ausführt, werden diese Prüfungen zur Laufzeit ausgeführt. In Crystal sind sie zur Kompilierungszeit bekannt, so dass diese Überprüfungen verschwinden. Ohne diese Prüfungen kann der Compiler Inline-Aufrufe durchführen und ziemlich verrückte Sachen machen (dank LLVM). Oder, zum Beispiel, eine Instanz nachschlagen varaibles ist eine Hash-Suche in Ruby (soweit ich weiß), während in Crystal es nur eine Speicherindirektion und laden ist.
  • In Crystal versuchen wir, zusätzliche Speicherzuweisungen zu vermeiden. Zum Beispiel schreibt to_s(io) in ein IO, anstatt das Objekt in eine Zeichenfolge im Speicher zu konvertieren. Oder wir haben Tupel für Arrays fester Größe, die auf dem Stack zugewiesen sind. Oder Sie können einen Typ als Struktur deklarieren, um Heap-Zuordnungen zu vermeiden.
  • Aufrufe an C erfolgen direkt ohne Wrapper. Nun, Sie könnten einen Wrapper haben, aber das wird von LLVM eingezeichnet. In Ruby muss immer zuerst eine Ruby-Methode aufgelöst werden.

Wahrscheinlich gibt es viele weitere Gründe, aber sie sind verwandt.

Verwandte Themen