2016-02-22 104 views

回答

31

我想這是一個事物的組合:

  • Ruby的解釋,並解釋可以改進。例如,像JS或Java這樣的其他解釋語言具有非常好的VM和JIT編譯器。
  • 在運行時完成的,在Crystal許多紅寶石檢查是在編譯時完成。例如,Ruby中的一個簡單的方法調用最終會在方法查找中進行。即使使用緩存,它也不會擊敗本地函數調用。或者當Ruby決定根據參數類型做不同的事情時,這些檢查是在運行時完成的。在Crystal中,它們在編譯時已知,所以這些檢查消失。如果沒有這些檢查,編譯器可以內聯調用,並做一些非常瘋狂的事情(感謝LLVM)。或者,例如,查找實例變量是Ruby中的哈希查找(據我所知),而在Crystal中它只是一個內存間接和負載。
  • 在Crystal中我們儘量避免額外的內存分配。例如to_s(io)寫入IO而不是將對象轉換爲內存中的字符串。或者我們擁有在堆棧中分配的固定大小數組的元組。或者你可以將一個類型聲明爲一個結構來避免堆分配。
  • 調用C直接完成,沒有包裝。那麼,你可以有一個包裝,但將由LLVM內聯。在Ruby中,它必須首先解析Ruby方法。

可能還有更多的原因,但它們是相關的。

相關問題