Javascript - низкая производительность в V8 функций, добавленных в String.prototype? - PullRequest
5 голосов
/ 06 декабря 2011

Я использовал некоторый код для извлечения 16-битных значений без знака из строки.

Я обнаружил, что добавление этой функции в прототип для String:

String.prototype.UInt16 = function(n) {
    return this.charCodeAt(n) + 256 * this.charCodeAt(n + 1);
};

являетсянамного медленнее, чем просто наличие функции, которая принимает String в качестве параметра:

var UInt16 = function(s, n) {
    return s.charCodeAt(n) + 256 * s.charCodeAt(n + 1);
};

В Firefox разница только в два раза, но в Chrome 15 это сто в разы медленнее!

См. результаты на http://jsperf.com/string-to-uint16

Может кто-нибудь предложить объяснение этому и / или предложить альтернативный способ использования прототипа без снижения производительности?

Ответы [ 2 ]

1 голос
/ 06 декабря 2011

Доступ к прототипу из примитива (потому что это не объект) намного медленнее, чем доступ к прототипу из объекта.

http://jsperf.com/string-to-uint16/2

В 10 раз быстрее в Chrome и в 2 раза быстрее в Firefox для меня.

Есть ли реальное узкое место в использовании прототипа? Это все еще очень быстро, если вам не нужны миллионы операций в секунду. Если вам нужно, то просто используйте функцию.

0 голосов
/ 27 декабря 2011

Alnitak , я сделал быстрый jsperf test (который я случайно опубликовал), и он показывает, что прототипы для пользовательских типов не медленнее.При рассмотрении того, как работают такие движки, как V8, имеет смысл, что компиляция Java будет вести себя по-разному при добавлении кода во встроенные объекты.

...