Объявление функции и разница в производительности выражения функции
Я использовал JSperf для тестирования небольшого образца кода.
Согласно нескольким статьям, с которыми я сталкивался, обе должны иметь одинаковую производительность с test2, имеющим небольшое преимущество. Но здесь все наоборот. Может кто-нибудь объяснить, почему огромная разница?
Изменить: я также понимаю разницу между ними обоими. Пожалуйста, не отмечайте это как дубликат этого или других вопросов, которые говорят о семантических различиях и не отвечают на мой вопрос о производительности.
Спасибо.
2 ответа
Благодаря мощной оптимизации, которую используют движки JavaScript в наши дни, подобные микропроцессоры дают несколько неверные результаты. Например, я предполагаю, что вы пытались измерить накладные расходы при вызове функции. Но похоже на то, как написан ваш код, вы можете (пере) определять определение функции и / или поиск символа один раз за каждые 10 раз, когда вы ее выполняете; Я предполагаю, что это не было целью.
В этом альтернативном тесте я упорядочил вещи, чтобы избежать повторного определения функции, и добавил несколько других способов вызова функций. Это уменьшает разницу в производительности до уровня, который, по моему мнению, преобладает из-за экспериментального шума. Хотя иногда могут быть очевидные различия, но я не буду считать их статистически значимыми, учитывая уровни экспериментальных ошибок. Другими словами, это сводит конкурс к виртуальной ничьей.
Даже в браузерах, где между подходами существует постоянное различие, кэширование функции в локальной переменной, по-видимому, сводит к минимуму разницу между определением и выражением.
Я также понимаю разницу между ними обоими.
Вы также понимаете эти семантические различия?
Обратите внимание, что jsPerf помещает ваш код в узкий цикл, время выполнения которого измеряется. Объявление функции требует создания области видимости блока для каждой итерации, что значительно замедляет тестирование. Это вряд ли то, что вы пытались измерить.