Повлияет ли использование рубиновой проверки типов Sorbet на производительность рубинового приложения?

Может быть, вопрос новичка, но если вы никогда не спросите, вы никогда не узнаете

Будет ли использование Stripe's Sorbet (https://sorbet.org/) в приложении RoR потенциально повысить производительность приложения? ? (производительность означает время отклика, а не надежность \ частота ошибок во время выполнения)

Я немного почитал о динамически типизированных языках (в частности, о Javascript в данном случае) и обнаружил, что если мы продолжаем отправлять какой-либо функции (например, foo) объекты одного и того же типа, движок выполняет некоторую оптимизацию этой функции, поэтому, когда она вызывается снова с теми же типами, интерпретация будет выполняться быстрее.

Я подумал, что, возможно, интерпретатор ruby ​​выполняет аналогичную работу, что потенциально может означать, что проверка типов может увеличить скорость интерпретации.


person zivaricha    schedule 08.07.2019    source источник


Ответы (2)


Я подумал, что, возможно, интерпретатор ruby ​​выполняет аналогичную работу, что потенциально может означать, что проверка типов может увеличить скорость интерпретации.

Это еще не так, но потенциально можно было бы построить это однажды. Целью Sorbet было создание системы типов для людей по сравнению с созданием системы типов для компьютеров (компилятор). Это может привести к снижению производительности, но поскольку Stripe запускает его в производственной среде, мы держим его под контролем. Внутренне мы вызываем нас, если накладные расходы составляют> 7% процессорного времени.

Я немного почитал о динамически типизированных языках (в частности, о Javascript в данном случае) и обнаружил, что если мы продолжаем отправлять какой-либо функции (например, foo) объекты одного и того же типа, движок выполняет некоторую оптимизацию этой функции, поэтому, когда она вызывается снова с теми же типами, интерпретация будет выполняться быстрее.

Да, это можно сделать. То, что вы описываете, является обычной оптимизацией в компиляторах Just-In-Time (JIT). Метод, на который вы, кажется, ссылаетесь, использует профилирование во время выполнения и на самом деле является распространенным альтернативным методом, который позволяет достичь этого результата в отсутствии системы типов. Также стоит отметить, что хорошо построенные JIT могут делать это чаще, чем система типов, поскольку система типов кодирует то, что может произойти, в то время как профилирование и JIT могут оптимизировать то, что фактически происходит на практике< /эм>.

Тем не менее, создание JIT часто требует гораздо больше работы, чем создание онлайн-компилятора, поэтому, в зависимости от суммы инвестиций, которую вы хотите вложить в ускорение Ruby, либо использование JIT, либо использование типов может оказаться лучше в различных реальных условиях. .

Я подумал, что, возможно, интерпретатор ruby ​​выполняет аналогичную работу, что потенциально может означать, что проверка типов может увеличить скорость интерпретации.

Резюмируя предыдущий абзац, система типов Sorbet в настоящее время не ускоряет Ruby, но и не сильно замедляет его. Системы типов действительно можно использовать для ускорения языков, но они не являются вашим единственным инструментом, поскольку основным конкурентом является профилирование и JIT-компиляция.

person user537862    schedule 08.07.2019

оптимизации, о которых вы говорите, больше применимы к JIT, над которым работают для среды выполнения ruby.

в общем, sorbet стремится к безопасности типов, вводя интерфейсы типов или сигнатуры методов. они включают статические проверки типов, которые применяются перед развертыванием приложения, чтобы избавиться от «ошибок типов».

sorbet поставляется с компонентом времени выполнения, который может принудительно проверять типы во время выполнения в вашем работающем приложении, но это снижает производительность приложений, поскольку они оборачивают вызовы методов для проверки правильных типов https://sorbet.org/docs/runtime#runtime-checked-sig-s

person phoet    schedule 08.07.2019