Вызов функции JavaScript быстрее через прототип или прямую ссылку? - PullRequest
1 голос
/ 05 апреля 2011

В JavaScript, скажем, я хочу вызвать aObj.myMethod () изнутри bObj.В случае моего приложения, с точки зрения дизайна, aObj является базовым классом для bObj.JavaScript является языком позднего связывания, что означает, что myMethod должен быть разрешен во время выполнения.Разрешает ли разрешение функции быстрее

////////// IF

1-я естественным образом согласен с моим дизайном и говорю bObj.prototype = aObj, а затем во время выполнения я вызываюbObj.myMethod:

function bObj(){...};

bObj.prototype=aObj;


//later
var myBObj=new bObj();
myBObj.myMethod();

//////////////////////// ИЛИ

2- разрешение функции может бытьмедленно прототипы, поэтому я сохраняю aObj как свойство в bObj, а изнутри bObj я вызываю aObj.myMethod ()

function bObj()
{
  this.myAObj=new aObj();
  ...
}     

//later:
var myBObj=new bObj();
myBObj.myAObj.myMethod();

Моя главная проблема - скорость выполнения.В моем приложении myMethod вызывается миллионы раз в секунду.Я знаю, что большинство браузеров кэшируют указатели на недавно вызванные функции, поэтому в обоих случаях процесс разрешения функций ускоряется.И все же кто-нибудь может предоставить более подробную информацию о механизме разрешения функций в этих двух случаях и дать некоторое представление о том, какой метод может быть быстрее?Механизм разрешения одинаков во всех браузерах или полностью зависит от браузера?

Ответы [ 2 ]

1 голос
/ 07 января 2012

Насколько вы правы, «разрешение функций может быть медленным». Итак, давайте посмотрим ..

После просмотра прототипа, если вы сделали myMethod методом-прототипом, например: aObj.prototype.myMethod = somemethod, то первый способ, myBObj.myMethod (), получит «разрешение» со второй попытки, когда он попадает в унаследованный метод-прототип, так как экземпляр myBObj myMethod не был установлен.

Второй способ, myBObj.myAObj.myMethod (), получит «разрешение разрешения» со второй попытки при попадании в метод прототипа, так как, опять же, метод экземпляра не был установлен (myAObj = new aObj () делает не установлен myAObj.myMethod, но будет установлен myAObj.prototype.myMethod, То, как вы это делаете, разницы нет.

Чтобы получить выигрыш в производительности от любого из способов, которыми вы делаете это либо убедитесь, что метод экземпляра, который вы собираетесь вызвать, установлен, а затем ссылаетесь на него:

bObj.myMethod=bObj.prototype.myMethod;
bObj.myMethod();

или

myAObj.myMethod=myAObj.prototype.myMethod;
bObj.myMethod();

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

Чтобы получить лучший прирост производительности, полностью исключите поиск и ссылка на способ-прототип:

myBobj.prototype.myMethod();

или

myBObj.myAObj.prototype.myMethod();

в этих двух последних случаях нет необходимости в «разрешении функции».

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

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

0 голосов
/ 18 января 2012

Я только что закончил несколько тестов производительности для этого конкретного случая.Он был запущен с Mozilla Rhino 1.7R3 в оптимизированном режиме.

Ваш вопрос на самом деле касается поиска свойств.Как только свойство (в вашем случае со значением функции) найдено в цепочке доступных областей, дальнейшие операции выполняются одинаково в обоих случаях.

Очевидный результат - поиск функции, определенной впрототип медленнее.В среднем вызов функции-прототипа занимал на 35% больше времени.Я получил тот же результат с прямым вызовом локальных функций по сравнению с прямым вызовом функций в глобальной области.

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

Примите решение.Помните, что прототип отлично подходит для сопровождения кода и повторного использования объектов.

...