Динамические переменные вместо статических замедляют работу JS?

У меня есть библиотека, которая часто использует, скажем, функцию «getAttribute» Node. Поэтому вместо того, чтобы иметь его как node.getAttribute(), если у меня есть node[getAttributeStr](), я могу получить getAttributeStr как локальное строковое значение «getAttribute», которое будет минимизировано, уменьшая размер кода.

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

node.getAttribute("abc");

Приведенный выше код будет заменен на.

var getAttributeStr = "getAttribute";
node[getAttributeStr]("abc")

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

Вы можете сами измерить, насколько он медленнее. Если Вас интересует небольшой код и Вы работаете с одним и тем же узлом, Вы можете сами минифицировать имя функции: let g = node.getAttribute.bind(node); g('abc') или комбинировать оба подхода.

Roman Hocke 09.04.2019 11:50

Взгляните на этот JSPerf (не мой, я нашел его в Интернете): jsperf.com/точка-против-квадратной скобки. Если вы запустите его несколько раз, вы увидите, что иногда выигрывает точка, иногда выигрывает скобка. Итак, основываясь на этом очень поверхностном и базовом тесте, я бы сказал, что различия несущественны.

Gerardo Furtado 09.04.2019 11:53

Возможно, было бы лучше использовать минификатор, который может просто превратить node.getAttribute("abc") в a.b("abc"), что даже короче, чем что-либо, использующее скобки. Также включите сжатие gzip на вашем сервере, чтобы сделать минимизацию менее важной.

Thomas 09.04.2019 12:11

@RomanHocke Я проверил это и не смог найти большой разницы ни разу. Думал выяснить, правильный это подход или нет, потому что ни в одном из популярных минификаторов нет такой опции.

Jagan 09.04.2019 15:25

@Thomas Как уже упоминалось, я пытался использовать популярные минификаторы, но они этого не делают.

Jagan 09.04.2019 15:28
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
7
5
146
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я быстро собрал jsperf-тест, используя ваш пример.

https://jsperf.com/dynamic-vs-static-method-call/1

Хотя они примерно одинаковы в хроме, нотация скобок кажется намного медленнее, чем статический вызов в firefox. В Edge точечная запись примерно в два раза быстрее на моей машине.

Чтобы ответить на ваш вопрос, да, это в некоторой степени замедлит выполнение в некоторых браузерах.

Однако на большинстве современных машин смена одной реализации на другую будет едва заметной. Согласно тесту, вы все еще можете вызывать динамический getAttribute 300 000 раз в секунду в самых медленных браузерах. С большинством веб-сайтов возникают более серьезные проблемы, такие как загрузка 500 КБ скриптов отслеживания и зависимостей для отображения одностраничного веб-сайта, запрос неминифицированных/кешированных источников, отображение десятков тяжеловесных объявлений и т. д., на которые следует обратить внимание в первую очередь.

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

Jagan 09.04.2019 15:30

@jagan Добро пожаловать! Не забывайте, что вы всегда можете уменьшить размер файла с помощью таких инструментов, как cssnano cssnano.co.

Tom M 09.04.2019 15:56

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