V8 разработчик здесь.Это сложная проблема;краткий ответ - «это зависит».
Тривиально верно, что обход длинной цепочки прототипов при поиске занимает больше времени.Однако, если это делается только один или два раза, тогда это время, как правило, слишком мало, чтобы иметь значение.
Итак, следующий вопрос: как часто будет такой поиск?V8 пытается кэшировать результаты поиска всякий раз, когда это возможно (ищите термин «встроенные кэши», если хотите узнать больше);Эффективность такого кеширования, как и всего кеширования, критически зависит от количества различных наблюдаемых случаев.
Так что, если ваш код в основном "мономорфен" (т. е. при любом данном foo.bar
поиске, foo
всегдаимеют одинаковый тип / форму, включая одну и ту же цепочку прототипов) или полиморфную низкую степень (до четырех различных типов foo
), тогда полный обход цепочки прототипов необходимо выполнить только один раз (или до четырех раз соответственно)), и после этого будут использоваться кэшированные результаты, поэтому, если вы выполняете такой код тысячи раз, вы не увидите разницы в производительности между цепочками прототипов, длина которых составляет один или сотни шагов.
Вклс другой стороны, если у вас есть загрузки свойств или хранилища, которые видят много разных типов (как это обычно бывает в определенных средах, где каждый отдельный поиск проходит через какую-то центральную функцию getProperty(object, property) { /* do some framework stuff, and then: */ return object[property]; }
), то кэширование становится бесполезным, и V8 должен выполнитьполный поиск каждый раз.Это особенно медленно для длинных цепочек прототипов, но, тем не менее, оно всегда намного медленнее, чем кешируемые случаи (даже для коротких цепочек прототипов).
В заключение, если вы несколько осторожны в отношении общего проекта программы и избегаетеимея много разных типов в одних и тех же местах кода, вы можете легко позволить себе очень длинные цепочки прототипов.Фактически, сохранение как можно большей части вашего кода мономорфно типизированным имеет тенденцию оказывать значительно большее влияние, чем сохранение коротких цепочек прототипов.С другой стороны, более короткие длины прототипа действительно облегчают жизнь двигателя, и лично я бы сказал, что они могут (если вы не переусердствуете) также улучшить читаемость, так что при прочих равных условиях,Я бы посоветовал вам максимально упростить вашу объектную модель.