2016-02-22 5 views
18

Мне очень хотелось бы знать, что именно делает Crystal быстрее, чем Ruby, в то время как код настолько похож. Короткий ответ может заключаться в том, что он скомпилирован, и Ruby интерпретируется, но я хотел бы больше узнать о спецификациях языка.Почему Crystal быстрее, чем Ruby?

ответ

31

Я предполагаю, что это сочетание вещей:

  • Рубин интерпретируется, и интерпретатор может быть улучшена. Например, другие интерпретируемые языки, такие как JS или Java, имеют очень хороший компилятор VM и JIT.
  • Многие проверки Ruby, выполняемые во время выполнения, в Crystal выполняются во время компиляции. Например, простой вызов метода в Ruby заканчивается поиском метода. Даже с кешем он не будет бить собственный вызов функции. Или когда Ruby решает делать разные вещи в зависимости от типа аргумента, эти проверки выполняются во время выполнения. В Crystal они известны во время компиляции, поэтому эти проверки исчезают. Без этих проверок компилятор может встраивать вызовы и делать довольно сумасшедшие вещи (благодаря LLVM). Или, например, поиск экземпляра varaibles - это поиск хэша в Ruby (насколько я знаю), в то время как в Crystal это просто косвенная память и загрузка.
  • В Crystal мы стараемся избегать дополнительных распределений памяти. Например, to_s(io) записывает в IO вместо преобразования объекта в строку в памяти. Или у нас есть кортежи для массивов фиксированного размера, которые выделяются в стеке. Или вы можете объявить тип как структуру, чтобы избежать выделения кучи.
  • Звонки на C выполняются напрямую, без оберток. Ну, вы можете иметь обертку, но это будет включено в LLVM. В Ruby всегда нужно сначала разрешить метод Ruby.

Возможно, есть еще много причин, но они связаны между собой.

Смежные вопросы