2013-07-16 3 views
-88

Есть ли разница в производительности между === условным оператором и оператором присваивания =? Я пишу некоторые предварительно сохранить крючок промежуточного программного мангустов и мне интересно, если есть много различий в скорости между:производительность Javascript, условный оператор против оператора присваивания

UserSchema.pre('save', function (next) { 
    if (!this.isModified()) { 
     return next(); 
    } 
    this.crm.isUpToDate = false; 
    next(); 
}); 

и

UserSchema.pre('save', function (next) { 
    if (!this.isModified()) { 
     return next(); 
    } 
    if (this.crm.update === true) { 
     this.crm.isUpToDate = false; 
    } 
    next(); 
}); 

EDIT:

Спасибо за конструктивную Комментарии.

В принципе, не похоже, что большая разница в производительности (как указано выше, это незначительно). Спасибо за классный инструмент для тестирования скорости http://jsperf.com/, я никогда не слышал об этом раньше.

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

Вот что я делаю:

У меня есть мангуста предварительно сохранить промежуточный крюк (для базы данных Монго), где крючок вызывается каждый раз, когда документ будет сохранен. В момент сохранения я проверяю, был ли обновлен документ. Если это было, я установил crmIsUpToDate в false. Значение crmIsUpToDate будет установлено в true при получении задания cron. Этот крючок можно запустить много раз, прежде чем задание cron попадет в документ.

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

+12

1) любое усиление производительности будет незначительным; 2) http://jsperf.com –

+14

Эти два примера не делают то же самое, что вы знаете? – adeneo

+3

Даже если есть, это уместно? Они не выполняют одну и ту же функцию и поэтому не могут быть надежно сопоставлены друг с другом. – War10ck

ответ

37

Если у вас есть язык без refcounting (который JavaScript не является) и выполняется присвоение ('=', что приводит к операции копирования) большого объекта, оно может быть «медленным». Поэтому проверка того, действительно ли эта операция копирования действительно необходима, может сэкономить вам значительное количество времени.

Но JavaScript язык является родным refcounting:

object1 = {a: 1, b: 2}; 
object2 = object1;   // refcounting copy? 
object1.a = 3;    // test by modifying the first object 
console.log(object2.a); // will return 3 => refcounting 

=> поэтому все операции присваивания ('=') довольно дешево.

И, тем более, вы работаете с собственным типом данных (bool, numbers будет одинаковым), который может быть даже быстрее или, по крайней мере, так же быстро, как и объекты.
ПРИМЕЧАНИЕ: строки не пересчитываются в JavaScript, они являются исключением в этом случае.

Итак, прямо сейчас мы узнали, что задание дешево. Но как насчет проверки личности («===»)?

В вашем коде вы должны проехать вниз по объекту this ->crm ->update - это занимает некоторое дополнительное время. И тогда необходимо проверить идентичность типа (bool), а затем, если содержимое (false) будет одинаковым.
Все это добавляет условия в поток программ, где современные процессоры с их длинными конвейерами могут угадать ветку, ошибочно создавая стойло и перезагружая полный конвейер. Это также приводит к довольно большому количеству циклов процессора (хотя современные процессоры сейчас довольно хороши).

=> Это сравнение ('===') довольно дорогое.

Заключение # 1:
Вы не должны защищать дешевый код, дорогой тест, который может быть легко избежать.
Когда код станет дороже, наступит точка, где тест сэкономит время в конце. Это приводит к:

Вывод № 2:
Преждевременная оптимизация это зло! Это может сделать код более трудным для чтения, ввести новые ошибки, сделать код более крупным (также вредным для эффективности кеша), ...
=> Оптимизировать только те части кода, в которых вы уверены, что работаете в проблеме производительности - и тогда только на основе профилирующих данных. Люди довольно плохо следят за эффектами здесь ...

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