Повлияет ли использование средства проверки типа ruby ​​на Sorbet на производительность приложения ruby? - PullRequest
0 голосов
/ 08 июля 2019

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 08 июля 2019

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

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

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

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

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

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

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

0 голосов
/ 08 июля 2019

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

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

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

...