Производительность закрытых членов в Javascript

Единственный способ реализации объектов с закрытыми членами в Javascript — использование замыканий, при котором привилегированные методы создаются в конструкторе. Но при таком подходе вы можете столкнуться с некоторыми проблемами в производительности, поскольку через прототипы ограничить доступ невозможно. Поэтому не рекомендуется использовать закрытые члены в объектах, которые часто создаются. Многие просто ставят символ подчёркивания перед названиями закрытых членов, чтобы отличать их от открытых. В этой статье я покажу, как много памяти и вычислительной мощности используют закрытые члены.

Вот код, который я использовал для тестирования. Он создаёт 10 методов для каждого класса.

// Методы определяются в прототипе
var PubClass = function(){
this.pub0 = 0;
this.pub1 = 0;
...
this.pub9 = 0;
}
PubClass.prototype.method0 = function(){
this.pub0++;
}
PubClass.prototype.method1 = function(){
this.pub1++;
}
...
PubClass.prototype.method9 = function(){
this.pub9++;
}

// Методы определяются в конструкторе
var PrivClass = function(){
var priv0 = 0;
var priv1 = 0;
...
var priv9 = 0;
this.method0 = function(){
priv0++;
}
this.method1 = function(){
priv1++;
}
...
this.method9 = function(){
priv9++;
}
}

Использование памяти

На этом графике показан объём используемой памяти при создании 100 000 экземпляров этих классов. В столбцах Public+ и Private+ указан объём памяти, требующийся для хранения экземпляров, а столбец Пустая страница показывает память, которую занимает браузер с одной открытой страницей
Использование памяти
Как вы можете заметить, методы, определённые в конструкторе занимают в 3-6 раз больше памяти. Также, обратите внимание на Internet Explorer, который может съесть всю память, если вы не будете предусмотрительны.

Производительность

Приведённая ниже таблица содержит количество вызовов каждой команды в секунду (в тысячах). Чем больше, тем лучше. new PubClass и new PrivClass это вызовы конструкторов, остальные две колонки — вызовы методов.

NEW PUBCLASS NEW PRIVCLASS МЕТОДЫ PUBCLASS МЕТОДЫ PRIVCLASS
FF 3.5 927 185 15400 1200
FF 3 507 121 1600 1400
IE 8 274 123 795 981
Chrome 2 26000 1800 39000 57000
Safari 4 10000 1600 50000 46000
Opera 9.64 1600 700 2100 2800

*В этой таблице приведены результаты для классов, имеющих всего один метод. При использовании 10 методов конструкции new PubClass потребуется почти в 2 раза больше времени, а new PrivClass — в 4-8 раз больше.

Вызовы методов быстры, даже если те создаются в конструкторе (исключение составляет Firefox 3), вызовы конструкторов — заметно медленнее.

Заключение

Никогда не используйте закрытые члены в совокупности с привилегированными методами для более чем тысячи объектов (5 Мб в IE), так как они требуют больше памяти. Также стоит избегать их, если вам необходимо создавать более двухсот объектов одновременно. Если же вы разрабатываете приложение для мобильных платформ, стоит поставить ещё более жёсткие ограничения.