В мире новостей

Поддержка

соблазнение


Оптимизируем «тяжелые» JavaScript-вычисления

Наиболее существенным препятствием для выполнения в веб-браузере «тяжелых» вычислений является тот факт, что весь интерфейс пользователя в браузере останавливается и ждет окончания исполнения JavaScript-кода. Это означает, что ни при каких условиях нельзя допускать того, чтобы для завершения работы скрипта требовалось более 300 мс (а лучше, если гораздо меньше). Нарушение этого правила неминуемо ведет к плохому восприятию ресурса пользователем.

К тому же в веб-браузерах у JavaScript-процесса имеется ограниченное время для завершения своего выполнения (это может быть фиксированное число в случае браузеров на движке Mozilla или какое-либо другое ограничение, например, максимальное число элементарных операций в случае Internet Explorer). Если скрипт выполняется слишком долго, то пользователю выводится диалоговое окно, в котором запрашивается, нужно ли прервать скрипт.

Оптимизируем вычисления

Google Gears ( http://gears.google.com/ ) обеспечивает выполнение напряженных вычислений без двух вышеоговоренных ограничений. Однако в общем случае нельзя полагаться на наличие Gears (в будущем было бы замечательно, чтобы решение по типу Gears WorkerPool API стало частью стандартного API браузеров).

К счастью, у глобального объекта есть метод setTimeout, который позволяет выполнять определенный код с задержкой, давая тем самым браузеру возможность обработать события и обновить интерфейс пользователя. Это сработает даже в том случае, если задержка для setTimeout выставлена в 0, что позволяет разбить долгоиграющий процесс на множество небольших частей. Общий шаблон для обеспечения такой функциональности можно представить в следующем виде:

function doSomething (callbackFn [, additional arguments]) {
    // Выполняем инициализацию (function () { 
    // Делаем вычисления... 
    if (конечное условие) { 
        // мы закончили 
        callbackFn(); 
        } else { 
            // Обрабатываем следующий кусок 
            setTimeout(arguments.callee, 0); 
        } 
    })();
}

Улучшаем шаблон

Этот шаблон можно немного видоизменить, чтобы он обрабатывался не по завершению процесса, а в ходе его исполнения. Это нам очень поможет при использовании индикатора состояния:

function doSomething (progressFn [, дополнительные аргументы]) { 
    // Выполняем инициализацию 
    (function () { 
        // Делаем вычисления... 
        if (условие для продолжения) { 
            // Уведомляем приложение о текущем прогрессе 
            progressFn(значение, всего);
             // Обрабатываем следующий кусок 
            setTimeout(arguments.callee, 0); 
        } 
    })();
}

Советы и замечания

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

2. Чем короче каждый цикл, тем больше накладные расходы, тем более интерактивен интерфейс пользователя (он лучше реагирует на действия пользователя), но тем больше общее время выполнения скрипта.

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

4. Никогда не передавайте строку в setTimeout! Если передать строку, то браузер будет каждый раз выполнять дополнительный eval при ее запуске, что, в общем счете, довольно сильно увеличит суммарное время выполнения скрипта за счет ненужных вычислений.

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

Заключение

Мы можем, в конце концов, выполнять все вычисления такого рода на сервере (хотя в этом случае придется иметь дело с преобразованием данных из одной формы в другую и сетевыми задержками, особенно, если объем данных достаточно велик). Запуск «тяжелых» вычислений на клиенте, скорее всего, является признаком глубоких, серьезных архитектурных проблем в нашем приложении.

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

 
Автобазар. Фото toyota avensis, характеристики и цены.|Мобильные ПК. Рекомендации о том какой ноутбук лучше купить.

Процесс подбора ключевых слов

Представим ситуацию. У компании, занимающейся продажей пластиковых окон, есть сайт. Большинство людей, которые хотят приобрести окна, не знают названия фирмы. Как в этом случае найти интернет-ресурс? Ввести в строку запроса поисковой системы фразу, которая предположительно будет встречаться на страницах сайта необходимого Вам. Такими фразами могут быть: "пластиковые окна", "пластиковые окна...

Читать полностью

Руководство по оптимизации сайта под поисковые системы: не так страшен черт…

Эта статьяобращена как к новичкам, так и к опытным оптимизаторам и SEO -консультантам. Статья родилась в противоположность утверждениям, что поисковая оптимизация сайта- сложная процедура и якобы требует просто феерически глубоких знаний ометодах раскрутки. На самом деле, получение результатов от SEO - долгий процесс, но методы поисковой оптимизации достаточно просты. Ниже я попытался...

Читать полностью

Колдунщики от Яндекса

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


Читать полностью

Что такое поисковая система Яндекс

Прежде чем пускаться в алгоритмические дебри, давайте вспомним, а как вообще устроена поисковая система.


Читать полностью
Группа "Креативные Веб Проекты" 107140 Россия, Москва, Гусятников переулок д.7