2012-02-07 4 views
2

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

Например

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

var object1 = new blueprint(value1,value2); 

против

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

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

+0

Вы можете проверить его на jsperf.com –

+0

@JamesMontagne Я не знал, что он существует. Спасибо, мне нужно будет добавить закладку для дальнейшего использования. –

+0

@nnnnnn Да, я заметил опечатку и исправил пару минут назад. –

ответ

0

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

4

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

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

3

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

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 

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

+1

Спасибо, Пит. Это именно то, что я искал. Хорошо иметь в виду будущее, если я когда-либо кодирую плагин с несколькими тысячами строк. –

6

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

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

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

«Намного проще оптимизировать правильный код, чем исправлять оптимизированный код».

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

+1

Я обязательно запомню это, Мальволио. Я до сих пор совершенно новичок в этом, поэтому всегда полезно получить такой совет. –

1

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

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

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

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

1

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

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