Проблемы с производительностью при добавлении многих функций к прототипам объектов в Javascript? - PullRequest
2 голосов
/ 07 апреля 2011

В настоящее время я пишу библиотеку методов расширения для множества различных объектов Javascript. Есть ли какие-то соображения по поводу производительности, если, например, я добавлю более 200 методов к различным объектам (через их прототипы) в одном и том же исходном файле?

РЕДАКТИРОВАТЬ: Просто для информации, я расширяю встроенные объекты.

1 Ответ

4 голосов
/ 07 апреля 2011

Нет, производительности почти не будет.Даже присоединение функций к прототипу (ам) должно занимать всего несколько мс (возможно, 5 мс), и более того, у вас есть 200 функций, которые хранятся в памяти в одном месте, никогда не копируются, вы никогда ничего не заметите.Предполагая, конечно, что вы подключаетесь к .prototype чего-либо.

Что касается того, почему нет попадания скорости: Чтобы разрешить вызов функции для объекта: foo.doSomething(), внутренний механизм долженпройти область действия объекта и прототип цепочки этого объекта.По сути, он делает это:

  • if(Object.hasOwnProperty('doSomething')){ // run Object.doSomething
  • if(Object.__proto__.hasOwnProperty('doSomething')){ // run Object.__proto__.doSomething
  • while(Object.__proto__.__proto__.__proto__.....){ // repeat

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

Для справки: jQuery имеет 511 внутренних функций.200 не так уж много

Примечание: НЕ РАСШИРЯТЬ Object.prototype - ТОЛЬКО НЕ ПРОСТО.Если вы делаете это, вы нарушаете циклы for-in или, по крайней мере, подходите очень близко к их разрыву, если люди не используют явные проверки if(obj.hasOwnProperty(foo)).Вы также сделаете циклы for-in более медленными на объектных хешах, что является ЕДИНСТВЕННЫМ потенциальным замедлением, с которым вы когда-либо сталкивались при расширении прототипов.

И ПОЖАЛУЙСТА, не расширяйте Array.prototype - это раздражает меня.Но многие другие люди делают это, так что это не так уж плохо ... Аргумент в том, что вы не должны предполагать , чтобы использовать циклы for-in на массивах, и многие люди теперь не потому, чтоиз Prototype.js, но вы все равно должны быть разрешены, если хотите!

...