2014-02-12 6 views
6

По this answer to 'Is object empty?':Могу ли я ускорить вызов собственных методов в JavaScript?

// Speed up calls to hasOwnProperty 
var hasOwnProperty = Object.prototype.hasOwnProperty; 

Я видел несколько реализаций нечто подобное в небольших библиотеках JavaScript, как:

var slice = Array.prototype.slice; 

//or 

function slice(collection) { 
    return Array.prototype.slice.call(collection); 
} 

Я сделал быстрый jsperf испытать такого рода вещи, и кэширование выглядел немного быстрее, чем не кеширование, но мой тест может быть испорчен.

(я использую слово «кэш» означает хранение метод внутри переменной.)

Контекст этого вопроса, когда разработчик должен назвать нативный метод несколько раз, и то, что наблюдаемая разница было бы.

Выполняет ли кэширование собственный метод, чтобы двигатель не мог заглянуть внутрь объекта для метода каждый раз при вызове метода, тем самым делая кеширование более быстрым способом вызова собственных методов всякий раз, когда разработчик должен вызывать один и тот же нативный метод больше чем единожды?

+1

[Является ли микро-оптимизация подходящей?] (Http://stackoverflow.com/a/3471000/402037) – Andreas

+0

Что заставляет вас думать, что это связано с естественностью методов? Часть, которая оптимизируется, повторный поиск атрибутов, должна быть полностью агностикой w.r.t. то, что просматривается (на самом деле, я не могу себе представить, что это не пробитая схема, где это может иметь значение). – delnan

+0

Что это значит, это поиск по цепочке вложенных прототипов для свойства. – Barmar

ответ

4

Когда вы используете Array.prototype.slice много, скажем, в библиотеке, то имеет смысл создать переменную, содержащую эту функцию (var slice = Array.prototype.slice;), так как переменная может быть минимизирован на Minifier JavaScript, который он не может в противном случае.

Назначение функции переменной также позволяет избежать пересечения цепочки прототипов объекта, что может привести к немного лучшей производительности.

Обратите внимание, что это микро-оптимизация, которую вы (вообще говоря) не должны слишком беспокоиться - оставьте это до современного механизма JavaScript.

+0

GZIP поражает преимущества минимизации использования символа переменной для ссылки, и это может фактически увеличить размер после GZIP. Тем не менее, преимущества производительности при отсутствии необходимости поиска свойств действительны. –

1

Сохранение значения в переменной дает некоторые возможности оптимизации, потому что, если его локальная переменная интерпретатор может сделать анализ, чтобы понять, что варируемая никогда не мутируется. С другой стороны, вам всегда нужно разыменовывать глобальные переменные, такие как Array, поскольку каждый может потенциально изменить их в любое время.

Сказанное, я понятия не имею, будет ли это иметь значение для производительности, особенно если вы рассмотрите оптимизацию JIT.

Обычно, основная причина, по которой люди используют var slice, заключается в том, чтобы сохранить исходный код коротким.

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