2014-11-26 4 views
1

Я разрабатываю веб-приложение и создаю много объектов в JavaScript, которые мне нужно поддерживать на протяжении всего сеанса или когда сайт открыт, и я делаю все объекты ссылкой на один глобальный объект. Будет ли это влиять на производительность веб-приложения?Создает ли слишком много объектов в javascript повлияет на производительность?

var Obj1 = somethig; 
var obj200 = something; 
window.global.Obj1 = Obj1; 
window.global.Obj200 = Obj200; 
+4

Сколько стоит «много»? –

+2

«Слишком много» подразумевает больше, чем необходимо, что является проблемой самого и самого себя. –

+0

Обратите внимание, что фрагмент кода, который вы показали, * не создает * любой объект. Он просто назначает переменные и свойства для обозначения уже существующих. – Bergi

ответ

9

Отказ от ответственности: Я инженер-программист на двигатель Чакра Javascript в Internet Explorer 9, а затем (Привет из здания 18!)

Короче говоря: «это зависит», - мы должны знать, как многие объекты, которые вы создаете, насколько они сложны (поскольку JavaScript не имеет классов, но прототипов и экземпляров), как часто вы их создаете, и если ваш скрипт/программа заставит GC собирать объекты (и GC бежит не очень).

Некоторые советы:

  1. Если вы храните много простых объектов данных, использовать массив, чтобы воспользоваться любой оптимизации времени выполнения будет иметь. И если вы используете массив, убедитесь, что все элементы имеют один и тот же базовый тип (например, не смешивайте объекты JavaScript с номерами в одном массиве).
  2. JavaScript-сборщик мусора, что означает, что он имеет все связанные с ним недостатки, включая приостановку выполнения всего сценария во время работы GC. Если многие объекты становятся доступными для сбора сразу, то пауза GC будет работать некоторое время. Следите за фрагментацией памяти.
  3. Избегайте свойства экземпляра (например, свойства использования прототипа или свойства конструктора), то есть:

Bad:

for(var i = 0; i < 1000; i++) { 
    var foo = { baz: function() { return 5; } }; 
    foo.bar(); 
} 

Хорошо:

function Foo() { } // `Foo` constructor. 

Foo.prototype.baz = function() { return 5; }; 

for(var i=0; i < 1000; i++) { 
    var foo = new Foo(); 
    foo.bar(); 
} 

Также хорошо:

function Foo() { } 

Foo.baz = function(foo) { return 5; }; 

for(var i=0; i < 1000; i++) { 
    var foo = new Foo(); 
    Foo.bar(foo); 
} 

Что касается вашего примера кода, если вы находитесь в корневой области (global, который в браузерах сглажен объектом window), то ключевое слово var вносит свой вклад в создание свойства. Так что это:

var Obj1 = somethig; 
var obj200 = something; 
window.Obj1 = Obj1; // there is no `window.global` object 
window.Obj200 = Obj200; 

... не делает ничего: var Obj1является то же самое, как window.Obj1.

И, наконец, протекция: дают только функции конструктора TitleCase имена, иначе все остальное (vars, parameters, locals и т. Д.) lowerCase имена. Вызов экземпляра Obj1 заставил меня подержать лицо.

Как всегда, золотое правило: преждевременная оптимизация есть корень всех зол - профильный код первого, чтобы увидеть, если есть проблема, прежде чем вносить существенные изменения в код (и IE 11 в F12 инструментах велики для проверки памяти и производительности обработки вашего кода, кстати, не то, чтобы я непредвзято!).

+0

Также стоит уточнить, что переменная автоматически становится свойством ** window **, даже если вы не используете ключевое слово 'var', что на самом деле намного хуже, особенно внутри функций. Кроме того, переменные, объявленные с использованием ключевого слова 'var', не могут быть удалены:' var x = 7; delete x; 'failed, где' y = 3; delete y; 'удастся удалить эту переменную и, следовательно, GCing. – istos

+0

Использование @istos оператора 'delete' только удаляет свойство из его родительского объекта; он не обязательно запускает GC, а также не делает память доступной для GC, и не обязательно, чтобы GC собирал объект в первую очередь. Излишние свойства 'delete'ing - это просто расточительные циклы. – Dai

+0

Итак, если у меня есть какой-то объект в памяти, который является свойством ** window **, и удалению удастся, что происходит с этим объектом? – istos

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