Javascript & HTML5 — optimization tips

Workers & Timers

• Никакая операция в JavaScript-сценарии не должна выполняться дольше 100 мс. Более длительные операции будут вызывать заметные задержки реакции пользовательского интерфейса и создавать негативные впечатления у пользователя.
• Броузеры по-разному реагируют на действия пользователя, производимые во время выполнения JavaScript-еценариев. Но независимо от поведения броузера у пользователя складываются отрицательные впечатления, когда выполнение сценария продолжается слишком долго.
• Применение таймеров позволяет отложить выполнение программного кода на более поздний срок, что дает возможность делить продолжительные операции на последовательности более мелких заданий.
• В новых версиях броузеров появился новый инструмент — фоновые потоки выполнения, с помощью которых можно выполнять программный код на JavaScript за пределами главного потока выполнения и тем самым предотвратить блокирование пользовательского интерфейса.

Language Tips

• Избегайте повторной интерпретации за счет отказа от использования функции evalQ и конструктора FunctionQ. Кроме того, функциям setTimeoutQ и setlntervalQ желательно передавать не строки, а ссылки на функции.
• Используйте литералы при создании новых объектов и массивов. Таким образом они создаются и инициализируются быстрее, чем при использовании других способов.
• Избегайте повторного выполнения одной и той же работы. Используйте прием отложенной загрузки или предварительной условной загрузки, когда возникает необходимость использовать логику определения типа броузера.
• При выполнении математических операций используйте битовые операторы, которые работают непосредственно с низкоуровневым представлением числа.
• Встроенные методы всегда выполняются быстрее, чем программный код на языке JavaScript. Всегда используйте встроенные методы, когда это возможно.

Strings & RegExp

Использование неэффективных строковых операций и невнимательность при создании регулярных выражений могут стать основными причинами потери производительности, однако советы, данные в этой главе, помогут вам избежать типичных ловушек.
• Операция слияния элементов массива является единственной, обеспечивающей приемлемую производительность в IE7 при конкатенации большого количества или длинных строк.
• В броузерах, отличных от IE7 и более ранних версий, операция слияния элементов массива является одним из самых медленных способов конкатенации строк. Вместо нее лучше использовать простые операторы + и += и стараться избегать создания промежуточных строк.
• Возвраты являются неотъемлемой составляющей процесса сопоставления с регулярными выражениями и одновременно потенциальным источником потерь эффективности.
• Бесконтрольное увеличение количества возвратов в регулярных выражениях, которые обычно работают очень быстро, может приводить к существенному их замедлению или даже к отказам при применении к строкам, имеющим частичные совпадения. В число приемов, позволяющих избежать этой проблемы, входят: обеспечение взаимоисключаемости смежных подвыражений, отказ от использования
вложенных квантификаторов, обеспечивающих возможность совпадения с одной и той же частью строки множеством способов, и устранение ненужных возвратов, используя атомарную природу опережающих проверок.
• Существует множество дополнительных приемов повышения эффективности, помогающих регулярным выражениям быстрее находить соответствия и тратить меньше времени на оценку позиций, в которых совпадение отсутствует (см. раздел «Дополнительные пути повышения производительности регулярных выражений»).
• Регулярные выражения не всегда являются лучшим инструментом решения задач, особенно когда требуется отыскать строковый литерал.
• Существует большое количество разных способов усечения строки. Однако наиболее оптимальное соотношение краткости и эффективности в разных броузерах при работе со строками разной длины и с разным содержимым обеспечивает прием на основе двух простых регулярных выражений (одно — для удаления начальных, а другое — для удаления завершающих пробельных символов). Отличной альтернативой, менее зависящей от общей длины строк, является цикл поиска первого непробельного символа, начиная с конца строки, или объединение его с регулярными выражениями.