Javascript: функция конструктора против скорости инициализатора объекта - PullRequest
2 голосов
/ 07 февраля 2012

Есть ли разница между скоростями выполнения функции конструктора по сравнению с эквивалентным инициализатором объекта?

Например

function blueprint(var1, var2){
    this.property1 = var1;
    this.property2 = var2;
}

var object1 = new blueprint(value1,value2);

против

object1 = {property1:value1, property2:value2};

Если так, то достаточно ли это важно для оптимизации кода или размер файла будет иметь приоритет?

Ответы [ 6 ]

7 голосов
/ 07 февраля 2012

Если есть, достаточно ли это важно для оптимизации кода или размер файла будет иметь приоритет?

Ни того, ни другого.

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

"Оптимизировать намного прощеправильный код, чем исправленный оптимизированный код. "

Пишите читаемый, поддерживаемый код и, когда он все правильный, проверьте, не слишком ли он медленный или неоправданно большой, и выполните оптимизацию.

4 голосов
/ 07 февраля 2012

Ран в консоли:

function blueprint(var1, var2){
    this.property1 = var1;
    this.property2 = var2;
}

var start = new Date();
var stop;
var object1;
for (var i = 0; i < 1000000; i++) {
    object1 = new blueprint(1,1);
}
stop = new Date();
console.log(stop - start);

Результаты ...

 Google Chrome: 2832 milliseconds

Firefox 3.6.17: 3441 milliseconds

Ран в консоли:

var start = new Date();
var stop;
var object1;
for (var i = 0; i < 1000000; i++) {
    object1 = {
        'property1': 1,
        'property2': 1
    };
}
stop = new Date();
console.log(stop - start);

Результаты ...

 Google Chrome: 2302 milliseconds

Firefox 3.6.17: 2285 milliseconds

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

4 голосов
/ 07 февраля 2012

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

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

1 голос
/ 28 мая 2014

Функция конструктора используется для нескольких записей в одном и том же «объекте».Инициализатор объекта должен использоваться только для ограниченного количества записей, например 3.

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

1 голос
/ 07 апреля 2013

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

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

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

Существуют также более формальные методы для создания объектов, такие как функция Object.create (). Однако это сложный и громоздкий в использовании и, кажется, не оптимизирован в любом текущем браузере. Во всех тестах, которые я запускал, он крайне медленный по сравнению с другими методами, но может быть полезен, когда вам нужны расширенные возможности и вы не будете вызывать его сотни раз.

0 голосов
/ 07 февраля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...