Почему функция-прототип в 40 раз медленнее, чем объявленная по умолчанию функция? - PullRequest
6 голосов
/ 02 марта 2012

Я играл с jsperf.com и обнаружил, что прототипная функция в 40 раз медленнее , чем объявленная функция "по умолчанию".

String.prototype.contains = function(s){ return !!~this.indexOf(s) } = 220 Кбит / с

против

function isContains(str, s) { return !!~str.indexOf(s) } = 8,5 тыс. Операций в секунду / с

Вот тестовый пример jsperf

P.S. Я знаю, что модификация прототипа не лучший вариант и может быть названа 'monkey patching':)

Ответы [ 2 ]

6 голосов
/ 02 марта 2012

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

Это также объясняет повышение производительности на new Object("hi").foo() по сравнению с "hi".foo().

Из документов MDN :

Строковые литералы (обозначенные двойными или одинарными кавычками) и строки, возвращаемые при вызовах String в контексте без конструктора (т.е. без использования ключевого слова new), являются примитивными строками. JavaScript автоматически преобразует примитивы и объекты String, так что можно использовать методы объекта String для примитивных строк. В тех случаях, когда метод должен вызываться для примитивной строки или происходит поиск свойства, JavaScript автоматически переносит строковый примитив и вызывает метод или выполняет поиск свойства.

Рядом:

Почему я не могу добавить свойства к строковому объекту в JavaScript?

Строковый объект по сравнению с литералом - изменение прототипа?

1 голос
/ 02 марта 2012

Скорее всего, вы заменяете примитивную функцию, реализованную в машинном коде C /, на тело JavaScript в версии с исправленными обезьянами.

...