Вопрос

Рассмотрим следующую функцию Javascript (1):

function setData(domElement) {
  domElement.myDataProperty = {
    'suppose': 'this',
    'object': 'is',
    'static': 'and',
    'pretty': 'big'
  };
};

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

var dataObject = {
  'suppose': 'this',
  'object': 'is',
  'static': 'and',
  'pretty': 'big'
};

function setData(domElement) {
  domElement.myDataProperty = dataObject;
};

Теперь объект создается один раз при загрузке скрипта и сохраняется в dataObject.Но давайте предположим, что setData вызывается лишь изредка - в большинстве случаев при загрузке скрипта функция не используется.Что мне не нравится в этой функции в этом случае, так это то, что объект всегда создается и хранится в памяти, включая множество случаев, когда он никогда не будет использоваться.Я подумал, что вы могли бы сделать что-то вроде этого, чтобы достичь идеального баланса (3):

var dataObject;

function setData(domElement) {
  if (!dataObject) {
    dataObject = {
      'suppose': 'this',
      'object': 'is',
      'static': 'and',
      'pretty': 'big'
    };
  }
  domElement.myDataProperty = dataObject;
};

Имеет ли это смысл?Я полагаю, что это зависит от того, когда интерпретатор решит создать объект.Действительно ли он ждет, пока пройдет !dataObject условие, или он входит в функцию, пытается быть умным и решает сконструировать его заранее?Возможно, разные механизмы Javascript имеют разные политики в отношении этого?

Тогда, конечно, возникает вопрос, будут ли эти оптимизации когда-либо иметь значение на практике.Очевидно, это зависит от таких факторов, как размер объекта, скорость двигателя, количество доступных ресурсов и т. д.Но в целом, какую оптимизацию вы бы назвали более значимой:от (1) к (2) или от (2) к (3)?

Это было полезно?

Решение

Ответ в том, что вы не должны знать.Примеры, которые вы показали, имеют между собой очень небольшую разницу.Единственный способ, которым вы могли бы обоснованно беспокоиться по этому поводу, - это иметь реальные доказательства того, что так или иначе заметно ухудшается производительность или использование памяти конкретного интерпретатора.А до тех пор задача переводчика — беспокоиться об этом за вас.

Тем не менее, если вы действительно хотите знать...Попробуйте и узнайте.вызовите разные версии 1 000 000 раз и посмотрите, какая разница.

Создайте гигантскую версию объекта и посмотрите, не оставит ли он вмятину.Смотри диспетчер задач.Попробуйте разные браузеры.Сообщите о своих результатах.Это гораздо лучший способ узнать, чем просто спрашивать кучку придурков в Интернете, что, по их мнению, может быть так.

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

Другие советы

Должен быть создан новый объект - этого не может быть, частично потому, что этого требует спецификация, но главным образом потому, что альтернативное поведение было бы нелогичным, возьмем:

function f() {
    return {a : "b", c: "d"};
}
o=f();
alert([o.c, o.e]); // Alerts "b,"
delete o.c;
o.e="f";
o=f();
alert([o.c, o.e]); // If the object was only created once this would produce ",f"

Вы действительно ожидаете, что новое выражение объекта на самом деле не создаст объект, который вы запрашиваете?Потому что ты, кажется, этого хочешь.

Возможно, вы просто хотите сделать:

var myFunction = (function(){
    var object = {a: "b", c: "d"};
    return function() { return object; }
})();

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

Во-первых, я бы реализовал его в ситуации №2 и загрузил один раз сразу после загрузки страницы.

Если бы была проблема со скоростью страницы, я бы измерял время, необходимое для выполнения конкретных задач на странице.

Если бы создание объекта было очень дорогим (условно говоря), то я бы перешел к ситуации №3.

Нет смысла добавлять оператор «if», если он действительно ничего вам не даст...и в этом случае создание простого/большого объекта не составит большого труда для вашего процессора.Без измерений вы не оптимизируете — вы просто стреляете вслепую.

На самом деле это довольно распространенный метод инициализации, который я лично использовал в C++ и Java.

Во-первых, эта оптимизация никогда не будет иметь значения на практике.

Во-вторых, последняя функция точно так же хороша, как и первая.Ну, почти.В первом случае, я полагаю, вы находитесь во власти сборщика мусора, который должен уничтожить старый объект при его переназначении. domElement.myDataProperty.Тем не менее, не зная точно, как сборщик мусора работает на вашей целевой платформе (а в разных браузерах он может сильно различаться), вы не можете быть уверены, что вообще сохраняете какую-либо работу.

Попробуйте все три из них в паре браузеров и выясните, какой из них быстрее.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top