Почему строковый литерал быстрее, чем объект String?

Мое понимание движка заключается в том, что когда дело доходит до литералов, он фактически создает новый временный объект всякий раз, когда для литерала вызывается метод.

Так что либо я неправильно понимаю, либо результат нуждается в объяснении: http://jsperf.com/literal-vs-object-231


person hilfe    schedule 11.04.2015    source источник
comment
Тест ничего не показывает, потому что он не работает должным образом. Вы должны поместить инициализацию в блок инициализации и не зацикливать код, который должен быть измерен. Тестовый движок выполняет цикл.   -  person Guffa    schedule 12.04.2015
comment
если вы не фиксируете вывод, невозможно сказать, что ядро ​​​​JS не обманывает и не пропускает работу, которую вы ожидаете от него.   -  person dandavis    schedule 12.04.2015


Ответы (2)


он фактически будет создавать новый временный объект всякий раз, когда вызывается метод

Ну да, именно так задаются вызовы методов для примитивных значений. Однако он используется только для объяснения поведения (поскольку это простой способ описать, как поиск свойств должен заканчиваться на нативных прототипах), а не для того, чтобы рассказать, как это на самом деле реализовано. (статический доступ к String.prototype, временный объект не задействован).

Почему строковый литерал быстрее, чем объект String?

Так что же делает движок со строковыми литералами? Они константы. Их тип известен. Доступ к собственности - мы знаем, что происходит. Подождите, кто-нибудь что-нибудь делает с результатами? Зачем вообще вызывать функцию без побочных эффектов?

Вы видите, к чему это ведет: к оптимизации. Не позволяйте компилятору обмануть микротесты.

person Bergi    schedule 11.04.2015

Браузеры могут и будут оптимизировать нативные строковые методы. Вызов String.toUpperCase() быстрее для литерала, потому что движок JS достаточно умен, чтобы просто предоставить строку в верхнем регистре и не выполнять ненужное приведение.

Если вы предоставляете пользовательский метод, вызывающий его, он работает быстрее для объекта, по крайней мере, в Chrome (это сильно зависит от движка JS), потому что у движка нет для него стратегии оптимизации. См. http://jsperf.com/literal-vs-object-231/2.

person JJJ    schedule 11.04.2015