2013-11-30 4 views
8

Если я делаю следующее:Почему вызов функции без ее владельца происходит медленнее?

var abs = Math.abs;

Shoudn't abs(-10) Быстрее чем Math.abs(-10)? Потому что abs вызывается напрямую.

Это то, что называется мое внимание: Math.abs vs custom abs function Result of a test done at jsperf.com

Update:

Тот же тест выполняется в Internet Explorer 11 показывает совершенно другой результат: Result of a test done at jsperf.com

Я бы спекулировать что это связано с некоторыми оптимизациями встроенных функций в V8 Engine от Chrome.

тест, созданный nnnnnn что проясняет, что я пытаюсь сказать: Property shortcut Result of a test done at jsperf.com

+1

Вы пробовали один и тот же тест с функцией, не встроенной в язык? – nnnnnn

+5

Почему бы не использовать дополнительную переменную для вызова той же функции. Я не думаю, что вы понимаете, как кеширование и передача по ссылке работают. – adeneo

+7

«Shoudn't abs (-10) быстрее, чем Math.abs (-10)?» Эрр, почему бы вам так подумать? Потому что меньше персонажей? – meagar

ответ

3

Этот ответ был бесполезен Гиви. См. Комментарии.

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

Однако, поиск Math.* функций происходит быстрее, скорее всего из-за внутренних оптимизаций двигателя V8 (так что «кеширование» встроенных функций в локальной переменной происходит на самом деле медленнее, тогда как «кеширование» пользовательских функций происходит быстрее).

Редактировать: here's a jsperf, демонстрируя, как функции Math.* работают быстрее, чем их аналогичные var x = Math.x, в то время как для пользовательской функции это не так. Именно так работает V8 imho. test results

Edit # 2: только сейчас я заметил эту строку из вашего вопроса:

Я бы предположить, что это связано с некоторыми оптимизациями на встроенном функций в V8 Engine Chrome.

Я не уверен на 100%, но это определенно выглядит таким образом, да.

+2

Откройте консоль javascript и поместите этот скрипт ... ### '(function() { для (var i = 100000000, start = new Date(). GetTime(); i> 0; i--) { Math.abs (-111); } var end = new Date() .getTime(); var result = end - start; console.войти (результат); }()); '### для проверки' Math.abs' и этого для 'var abs = Math.abs;' ### '(function() { var abs = Math.abs; для (var i = 100000000, start = new Date(). getTime(); i> 0; i--) { abs (-111); } var end = new Date(). getTime(); var result = end-start; console.log (результат); }()); '### – Givi

+2

' Math.abs' -> 23609; 'var abs = Math.abs' -> 1125. Это гвозди ... так что я думаю, что jsperf нельзя доверять. Спасибо Гиви. – Mtz

+2

Посмотрите на [jsFiddle] (http://jsfiddle.net/GKDev/jhHX7/) было бы лучше, если вы скопируете источник и вставьте его прямо в консоль javascript. – Givi

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