Почему приложение грузит CPU. Потоки и файлы Ложка дегтя в бочке с медом

1.1. Определение потока

Потоком в Windows называется объект ядра, которому операционная система выделяет процессорное время для выполнения приложения. Каждому потоку принадлежат следующие ресурсы:

  • код исполняемой функции;
  • набор регистров процессора;
  • стек для работы приложения;
  • стек для работы операционной системы;
  • маркер доступа, который содержит информацию для системы безопасности.

Все эти ресурсы образуют контекст потока в Windows . Кроме дескриптора каждый поток в Windows также имеет свой идентификатор, который уникален для потоков выполняющихся в системе. Идентификаторы потоков используются служебными программами, которые позволяют пользователям системы отслеживать работу потоков.

В операционных системах Windows различаются потоки двух типов:

  • системные потоки;
  • пользовательские потоки.

Системные потоки выполняют различные сервисы операционной системы и запускаются ядром операционной системы.

Пользовательские потоки служат для решения задач пользователя и запускаются приложением.

В работающем приложении различаются потоки двух типов:

  • рабочие потоки (working threads);
  • потоки интерфейса пользователя (user interface threads).

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

Создается поток функцией CreateThread

function CreateThread (
lpThreadAttributes: Pointer; // атрибуты защиты
dwStackSize: DWORD; // размер стека потока в байтах
lpStartAddress: TFNThreadStartRoutine; // адрес функции
lpParameter: Pointer; // адрес параметра
dwCreationFlags: DWORD; // флаги создания потока
var lpThreadId: DWORD // идентификатор потока
): THandle;

При успешном завершении функция CreateThread возвращает дескриптор созданного потока и его идентификатор, который является уникальным для всей системы. В противном случае эта функция возвращает значение nil .

Назначение параметров

lpThreadAttributes

Параметр lpThreadAttributes устанавливает атрибуты защиты создаваемого потока. До тех пор пока мы не изучим систему безопасности в Windows, мы будем устанавливать значения этого параметра в nil при вызове почти всех функций ядра Windows. В данном случае это означает, что операционная система сама установит атрибуты защиты потока, используя настройки по умолчанию.

Параметр dwStacksize определяет размер стека, который выделяется потоку при запуске. Если этот параметр равен нулю, то потоку выделяется стек, размер которого по умолчанию равен 1 Мбайт . Это наименьший размер стека, который может быть выделен потоку. Если величина параметра dwStacksize меньше значения, заданного по умолчанию, то все равно потоку выделяется стек размером в 1 Мбайт . Операционная система Windows округляет размер стека до одной страницы памяти, который обычно равен 4 Кбайт .

Параметр lpStartAddress указывает на исполняемую потоком функцию.

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

Параметр dwCreationFiags определяет, в каком состоянии будет создан поток. Если значение этого параметра равно 0, то функция потока начинает выполняться сразу после создания потока. Если же значение этого параметра равно CREATE_SUSPENDED , то поток создается в подвешенном состоянии. В дальнейшем этот поток можно запустить вызовом функции ResumeThread .

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

При создании потока его базовый приоритет устанавливается как сумма приоритета процесса, в контексте которого этот поток выполняется, и уровня приоритета потока THREAD_PRIORITY_NORMAL .

В листинге 1.1 приведен пример программы, которая использует функцию CreateThread для создания потока и демонстрирует способ передачи параметров исполняемой потоком функции.

Листинг 1.1. Создание потока функцией CreateThread

Program CreateThreadd; {$APPTYPE CONSOLE} uses SysUtils, Windows; var n: Integer = 0; inc: Integer = 10; hThread: HWND; IDThread: DWORD; procedure Add(iNum: Pointer); stdcall; begin Writeln("Thread is started"); n:= n + Integer(iNum^); Writeln("Thread is finished"); end; begin Writeln("n = ", n); //запускаем поток Add hThread:= CreateThread(nil, 0, @Add, @inc, 0, IDThread); //Ждем, пока поток Add закончит работу WaitForSingleObject(hThread, INFINITE); //закрываем дескриптор потока Add CloseHandle(hThread); Writeln("n = ", n); Readln; end.

Отметим, что в этой программе используется функция WaitForSingleObject , которая ждет завершения потока Add .

Поток завершается вызовом функции ExitThread , которая имеет следующий прототип:

procedure ExitThread (
dwExitCode: DWORD //код завершения потока
); stdcall;

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

Один поток может завершить другой поток, вызвав функцию TerminateThread

function TerminateThread (
hThread: THandle; //дескриптор потока
dwExitCode: DWORD; //код завершения потока
): BOOL; stdcall;

В случае успешного завершения функция TerminateThread возвращает ненулевое значение, в противном случае - FALSE . Функция TerminateThread завершает поток, но не освобождает все ресурсы, принадлежащие этому потоку. Это происходит потому, что при выполнении этой функции система не посылает динамическим библиотекам, загруженным процессом, сообщение о том, что поток завершает свою работу. В результате динамическая библиотека не освобождает ресурсы, которые были захвачены для работы с этим потоком. Поэтому эта функция должна вызываться только в аварийных ситуациях при зависании потока.

В листинге 1.2 приведена программа, которая демонстрирует работу функции TerminateThread .

Program TerminateThreadd; {$APPTYPE CONSOLE} uses SysUtils, Windows; var count: Cardinal = 0; hThread: HWND; IDThread: DWORD; c: Char; b1: Boolean = True; procedure thread; stdcall; var b2: Boolean; begin b2:= True; while b2 do begin count:= count + 1; Sleep(100); // немного отдохнем end; end; begin hThread:= CreateThread(nil, 0, @thread, nil, 0, IDThread); while b1 do begin Write("Input ""y"" to display the count or any char to finish: "); Readln(c); if c = "y" then Writeln("count = ", count) else Break; end; //прерываем выполнение потока thread TerminateThread(hThread, 0); //закрываем дескриптор потока CloseHandle(hThread); end.

Каждый созданный поток имеет счетчик приостановок, максимальное значение которого равно MAXIMUM_SUSPEND_COUNT . Счетчик приостановок показывает, сколько раз исполнение потока было приостановлено. Поток может исполняться только при условии, что значение счетчика приостановок равно нулю. В противном случае поток не исполняется или, как говорят, находится в подвешенном состоянии. Исполнение каждого потока может быть приостановлено вызовом функции SuspendThread , которая имеет следующий прототип:

function SuspendThread (
hThread: THandle //дескриптор потока
): DWORD; stdcall;

Эта функция увеличивает значение счетчика приостановок на 1 и, при успешном завершении, возвращает текущее значение этого счетчика. В случае неудачи функция SuspendThread возвращает значение, равное -1.

Отметим, что поток может приостановить также и сам себя. Для этого он должен передать функции SuspendThread свой псевдодескриптор, который можно получить при помощи функции GetCurrentThread .

Для возобновления исполнения потока используется функция ResumeThread , которая имеет следующий прототип:

function ResumeThread (
hThread: THandle //дескриптор потока
): DWORD; stdcall;

Функция ResumeThread уменьшает значение счетчика приостановок на 1 при условии, что это значение было больше нуля. Если полученное значение счетчика приостановок равно 0, то исполнение потока возобновляется, в противном случае поток остается в подвешенном состоянии. Если при вызове функции ResumeThread значение счетчика приостановок было равным 0, то это значит, что поток не находится в подвешенном состоянии. В этом случае функция не выполняет никаких действий. При успешном завершении функция ResumeThread возвращает текущее значение счетчика приостановок, в противном случае - значение -1.

Поток может задержать свое исполнение вызовом функции Sleep , которая имеет следующий прототип:

procedure Sleep (
dwMilliseconds: DWORD //миллисекунды
); stdcall;

Единственный параметр функции Sleep определяет количество миллисекунд, на которые поток, вызвавший эту функцию, приостанавливает свое исполнение. Если значение этого параметра равно 0, то выполнение потока просто прерывается, а затем возобновляется при условии, что нет других потоков, ждущих выделения процессорного времени. Если же значение этого параметра равно INFINITE , тo поток приостанавливает свое исполнение навсегда, что приводит к блокированию работы приложения.

В листинге 1.3 приведена программа, которая демонстрирует работу функций SuspendThread , ResumeThread и Sleep .

//Пример работы функций SuspendThread, ResumeThread и Sleep program SuspendThreadd; {$APPTYPE CONSOLE} uses SysUtils, Windows; var nCount: Cardinal = 0; dwCount: DWORD; hThread: HWND; IDThread: DWORD; c: Char; b: Boolean = True; procedure thread; stdcall; begin while b do begin nCount:= nCount + 1; Sleep(100); // приостанавливаем поток на 100 миллисекунд end; end; begin hThread:= CreateThread(nil, 0, @thread, nil, 0, IDThread); while b do begin Writeln("Input:"); Writeln(#9, """n"" to exit"); Writeln(#9, """y"" to display the count"); Writeln(#9, """s"" to suspend thread"); Writeln(#9, """r"" to resume thread"); Readln(c); case c of "n": Break; "y": Writeln("count = ", nCount); "s": begin //приостанавливаем поток thread dwCount:= SuspendThread(hThread); Writeln("Thread suspend count = ", dwCount); end; "r": begin //возобнавляем поток thread dwCount:= ResumeThread(hThread); Writeln("Thread suspend count = ", dwCount); end; end; end; //прерываем выполнение потока thread TerminateThread(hThread, 0); //закрываем дескриптор потока CloseHandle(hThread); end.

Иногда потоку требуется знать свой дескриптор, чтобы изменить какие-то свои характеристики. Например, поток может изменить свой приоритет. Для этих целей в Win32 API существует функция GetcurrentThread , которая имеет следующий прототип:

function GetCurrentThread : THandle; stdcall;

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

В листинге 1.4 приведен пример программы, которая вызывает функцию GetCurrentThread , а затем выводит на консоль полученный псевдодескриптор.

//Пример работы функции GetcurrentThread program GetCurrentThreadd; {$APPTYPE CONSOLE} uses SysUtils, Windows; var hThread: HWND; begin // получаем псевдодескриптор текущего потока hThread:= GetCurrentThread; // получаем псевдодескриптор текущего потока Writeln(hThread); Readln; end.

Большинство функций Win32 API возвращают код, по которому можно определить, как завершилась функция: успешно или нет. Если функция завершилась неудачей, то код возврата обычно равен false , nil или -1. В этом случае функция Win32 API также устанавливает внутренний код ошибки, который называется кодом последней ошибки (last-error code) и поддерживается отдельно для каждого потока. Чтобы получить код последней ошибки, нужно вызвать функцию GetLastError , которая имеет следующий прототип:

function GetLastError : DWORD; stdcall;

Эта функция возвращает код последней ошибки, установленной в потоке. Установить код последней ошибки в потоке можно при помощи функции SetLastError , имеющей следующий прототип:

procedure SetLastError (
dwErrCode: DWORD //код ошибки
); stdcall;

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

function FormatMessage (
dwFlags: DWORD; // режимы форматирования
lpSource: Pointer; // источник сообщения
dwMessageId: DWORD; // идентификатор сообщения
dwLanguageId: DWORD; // идентификатор языка
lpBuffer: PChar; // буфер для сообщения
nSize: DWORD; // максимальный размер буфера для сообщения
Arguments: Pointer // список значений для вставки в сообщение
): DWORD; stdcall;

В листинге 1.5 приведен пример программы, которая вызывает функцию FormatMessage

Program ErrorMessageBoxx; {$APPTYPE CONSOLE} uses SysUtils, Windows; var hHandle: THandle; procedure ErrorMessageBox; var lpMsgBuf: PChar; begin FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER or FORMAT_MESSAGE_FROM_SYSTEM or FORMAT_MESSAGE_IGNORE_INSERTS, nil, GetLastError, 0, @lpMsgBuf, 0, nil); MessageBox(0, lpMsgBuf, "Error Win32 API", MB_OK or MB_ICONINFORMATION); //Освободить буфер LocalFree(Integer(lpMsgBuf)); end; //тест для функции вывода сообщения об ошибке на консоль begin hHandle:= 0; //неправильный вызов функции закрытия дескритптора if not CloseHandle(hHandle) then ErrorMessageBox; end.

Исходный код скачать . Выполнен на Delphi XE.

Используемая литература: Александр Побегайло "Системное программироввние в Windows"

5.6. Уплотняем поток загрузки

Рассмотрев методы сжатия, объединения, кэширования и создания параллельных соединений, разумно было бы озадачиться следующим вопросом: какая часть страницы должна загружаться вместе с основным HTML-файлом, а какая - только с внешними файлами?

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

Кроме того, были проведены теоретические выкладки для определения оптимального распределения загрузки по стадиям с учетом всех аспектов.

Из книги Разгони свой сайт автора Мациевский Николай

Итоговая таблица Ниже приведены все результаты оптимизации для отдельной взятой страницы. Загрузка тестировалась на соединении 100 Кб/с, общее число первоначальных объектов: 23. Номер шага Описание Общий размер (кб) Время загрузки (мс) 1Обычная страница. Ничего не сжато

Из книги Iptables Tutorial 1.1.19 автора Andreasson Oskar

Из книги ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ВСТРОЕННЫХ СИСТЕМ. Общие требования к разработке и документированию автора Госстандарт России

Из книги Linux для пользователя автора Костромин Виктор Алексеевич

2.4.3. Варианты загрузки Итак, на мой взгляд, выбор варианта загрузки производится следующим образом: Если у вас установлена Windows NT или Windows 2000, то используйте NT Loader. Если у вас стоит Windows 95 или Windows 98 на FAT16, и вы не хотите ставить программу-загрузчик из другой ОС или от

Из книги 200 лучших программ для Интернета. Популярный самоучитель автора Краинский И

8.2. Процедура загрузки ОС Linux Для начала надо отметить, что все, о чем будет рассказано в этом разделе, относится к дистрибутиву Red Hat и его аналогам. В других дистрибутивах (например, Debian) процедуры загрузки могут быть организованы иначе.

Из книги Asterisk™: будущее телефонии Второе издание автора Меггелен Джим Ван

Менеджеры загрузки Ничто так не раздражает пользователя Интернета, как медленная скорость загрузки. Решать эту проблему можно по-разному. Можно использовать различные браузеры и выбрать самый быстрый или накопить денег и купить дорогой модем, который будет уверенно

Из книги TCP/IP Архитектура, протоколы, реализация (включая IP версии 6 и IP Security) автора Фейт Сидни М

Протокол, используемый для загрузки Телефоны Polycom могут загружать свою конфигурацию по одному из трех протоколов: TFTP, HTTP и FTP.Сразу же хотим попросить избегать TFTP. Он не обеспечивает необходимой безопасности, и телефон не может использовать информацию о дате для

Из книги Самоучитель работы на Macintosh автора Скрылина Софья

11.11 Параметры загрузки Параметры таблицы 11.1 могут содержаться в ответах протоколов BOOTP или DHCP, а параметры таблицы 11.2 могут использоваться только в DHCP.Таблица 11.2 Параметры DHCP Дополнительные параметры только для DHCP Requested IP Address (запрошенный IP-адрес) Клиент запросил

Из книги Первые шаги с Windows 7. Руководство для начинающих автора Колисниченко Денис Н.

4.1.6. Папка Загрузки Нажатие на кнопку Сохранить (Save), расположенную в заголовке письма, приводит к автоматическому сохранению прикрепленных файлов в папке Загрузки (Downloads), которая находится в домашней папке пользователя (рис. 4.21). Ее можно открыть, как любую папку, в окне

Из книги Linux: Полное руководство автора Колисниченко Денис Николаевич

2.4.4. Включение загрузки с DVD Чтобы загрузиться с установочного диска Windows, нужно изменить порядок загрузки в BIOS Setup (чтобы система загружалась с DVD, а не с жесткого диска). В случае со стационарным компьютером для входа в BIOS Setup обычно достаточно нажать клавишу сразу,

Из книги Adobe Flash. Создание аркад, головоломок и других игр с помощью ActionScript автора Розенцвейг Гэри

9.1.2. Продолжение загрузки. Демон initС момента загрузки ядра процесс начальной загрузки системы идет под управлением самой системы. Первой получает управление процедура автозапуска ядра. Она определяет объем доступной оперативной памяти, тип и быстродействие процессора,

Из книги Как раскрутить и разрекламировать Web-сайт в сети Интернет автора Загуменов Александр Петрович

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

Из книги Linux глазами хакера автора Флёнов Михаил Евгеньевич

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

Из книги Windows 10. Секреты и устройство автора Алмаметов Владимир

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

Из книги автора

10.3.2. Контроль загрузки файлов Загрузка файлов - самая опасная возможность для сервера. Каждый пользователь должен иметь право обращаться только к своей директории. А что делать, чтобы анонимные пользователи тоже могли работать с файлами? В этом случае нужно по

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

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

Сразу уточним, что все они, разумеется, поддерживают многопоточное скачивание и докачку файлов после обрыва связи и автоматически подбирают оптимальную (в зависимости от типа соединений) скорость скачивания. А также интегрируются в популярные браузеры, заменяя стандартный модуль закачки, и следят за буфером обмена, самостоятельно выявляя ссылки. А значит, в целом любое из названных решений обеспечивает быстрое и надежное скачивание файлов с FTP- и HTTP-серверов.

Между собой менеджеры закачки различаются разнообразными нюансами (см. таблицу). В частности, не все они обеспечивают частичное скачивание ZIP-архивов, корректно распознают ссылки с файлохранилищ, таких как Rapidshare в бесплатном режиме, и позволяют напрямую (то есть просто добавив URL вида http://www.youtube.com/watch?v=...) скачивать клипы с онлайновых видеосервисов3 (YouTube, Google Video и др.). Не все download-менеджеры умеют производить скачивание с защищенных FTP- и веб-серверов (то есть по протоколам SFTP и HTTPS соответственно) и позволяют оценить размер файла перед его загрузкой. А уж поддержка BitTorrent- и eDonkey-клиентов вообще реализована лишь в некоторых менеджерах загрузки, что, впрочем, на наш взгляд, уже не столь актуально, поскольку функциональность подобных клиентов невелика. В различных решениях разные списки поддерживаемых интернет-браузеров, да и сам принцип подобной интеграции различен: где-то достаточно просто включить соответствующие флажки в настройках, а где-то потребуется предварительно скачать и установить соответствующий браузеру плагин. Кроме того, имеются и более тонкие различия, касающиеся самого процесса закачки, - например в одних решениях при обнаружении активности браузера приоритет по трафику автоматически изменяется (а где-то это придется делать вручную), в других можно назначать закачкам приоритеты (что в части продуктов не предусмотрено) и т.п.

GetRight/GetRight Pro 6.3e

Разработчик : Headlight Software

Размер дистрибутива: GetRight - 4,78 Мбайт; GetRight Pro - 4,91 Мбайт

Работа под управлением: Windows 95/98/Me/NT/2000/XP/Vista

Способ распространения: shareware (30-дневная демо-версия: GetRight - http://download.getright.com/getright-download.exe ; GetRight Pro - http://download.getright.com/getright_pro_setup.exe)

Цена : GetRight - 19,95 долл.; GetRight Pro - 49,95 долл.

GetRight - давно присутствующий на рынке и завоевавший популярность благодаря удобству и надежной работе менеджер закачки, который сегодня уже далеко не столь привлекателен для широкого круга пользователей, поскольку по ряду параметров уступает аналогам и предлагается по весьма высокой цене. Да и дальнейшая разработка этого решения, по сути, уже не ведется. Данный download-менеджер позволяет скачивать файлы (в том числе по расписанию) по протоколам HTTP, HTTPS, FTP и FTPS и может использоваться для скачивания файлов с файлообменных серверов, получения новых музыкальных клипов в Podcast/RSS-канал и скачивания файлов по протоколу BitTorrent (имеется возможность одновременного получения части данных по FTP/HTTP, а части - из BitTorrent с последующим «склеиванием» на лету). Предусмотрена возможность автоматического добавления полученных мультимедиафайлов в плейлисты приложений MediaPlayer и iTunes. Однако утилита не поможет при скачивании видео с видеохостингов и частичном скачивании архивов.

GetRight автоматически интегрируется в ведущие браузеры, причем указать перечень интересующих браузеров можно при установке утилиты. Специальный встроенный обозреватель обеспечивает просмотр структуры папок FTP-серверов и HTTP-сайтов. Ограничение трафика производится вручную путем установки максимально допустимого предела скорости закачки, при этом разрешается включить флажок для снятия этого ограничения в моменты активности скринсейвера. Перед скачиванием можно проверить интересующий адрес на существование и уточнить размер файла. Количество одновременно скачиваемых файлов и число потоков регулируются, а лучшие «зеркала» для скачивания несложно найти автоматически либо указать вручную. В зависимости от типов закачиваемые файлы могут распределяться по разным папкам, для папок разрешается устанавливать приоритеты. По завершении закачки возможно автоматическое проведение оценки целостности полученных файлов и проверки их на вирусы.

Программа представлена в двух версиях - базовой GetRight и расширенной GetRight Pro. В Pro-версии предусмотрена возможность работы в режиме «клиент-сервер» (для скачивания файлов одним компьютером в сети, которому с остальных просто передаются ссылки) и в качестве прокси-сервера (позволяет другим интернет-утилитам использовать возможности GetRight по докачке файлов). В нее также встроен функционал для синхронизации уже скачанных файлов в случае появления на серверах их обновлений и закачки файлов на серверы, имеется скриптовый язык (обеспечивает расширенные возможности управления скачиванием), можно лимитировать скорость скачивания отдельных файлов и др.

Download Master 5.5.12.1171

Разработчик: WestByte Software

Размер дистрибутива: стандартная версия - 5,24 Мбайт; версия Portable - 3,7 Мбайт

Работа под управлением: Windows 95/98/Me/NT 4.0/2000/XP/Vista

Способ распространения: freeware (http://www.westbyte.com/dm/index.phtml?page=download&lng=Russian)

Цена: бесплатно

Download Master - многофункциональный download-менеджер, позволяющий загружать файлы не только с FTP- и HTTP-серверов, но также с популярных видеосервисов (YouTube, Google Video, RuTube, Видео@mail.?ru, Rambler Vision) и файлохранилищ (включая Rapidshare) в бесплатном режиме. В случае ZIP-архивов их содержимое может просматриваться перед закачкой, предусмотрена также возможность закачки только выбранных из архива файлов. Реализован поиск файлов, программ, игр и музыки в каталоге файлов TopDownloads.

Download Master интегрируется во все самые популярные браузеры (для клонов IE потребуется настройка параметров), а встроенный в утилиту FTP Explorer обеспечивает удобную навигацию по FTP-серверам. Утилита умеет самостоятельно определять типы загружаемых файлов и распределяет их по категориям (программы, музыка, видео и пр.), а при снижении скорости автоматически перезапускает закачку, что позволяет избежать простоев. Скачивание ведется в несколько потоков. При необходимости для определенных сайтов число потоков несложно ограничить и настроить программу так, чтобы скачиваемые с них файлы сохранялись в определенных папках и/или категориях. По окончании скачивания возможно отключение от Интернета, переход в спящий режим, выключение компьютера и т.п. Предусмотрено управление скоростью закачки и автоматическое ее снижение в случае, если пользователь занялся интернет-серфингом. Возможна работа по расписанию, а также проверка закачанных файлов на обновление и синхронизация (автообновление) файлов на сервере и локальном ПК.

Программа представлена в двух версиях: стандартной Download Master и портативной Download Master Portable. Последняя не требует установки и может быть записана на флэшку или внешний диск, что обеспечивает возможность скачивания файлов на любом подключенном к Интернету компьютере. В версии Portable нет интеграции с браузерами и отключена возможность экспорта/импорта настроек, поэтому для применения на собственном компьютере более удобной будет стандартная версия программы.

ReGet Deluxe 5.2

Разработчик: ReGet Software

Размер дистрибутива: ReGet Deluxe - 2,5 Мбайт; ReGet Deluxe Personal - 2 Мбайт

Работа под управлением: Windows 2000(SP3/SP4)/XP(SP2)/Server 2003/Vista

Способ распространения: shareware (30-дневная демо-версия: ReGet Deluxe - http://download.reget.com/regetdx.exe ; ReGet Deluxe Personal - http://download.reget.com/regetdxpers.exe)

Цена: ReGet Deluxe - 600 руб; ReGet Deluxe Personal - бесплатно (только для домашнего применения)

ReGet Deluxe - многофункциональный менеджер закачек, позволяющий загружать файлы (в том числе по расписанию) не только с обычных FTP- и HTTP-серверов, но и с защищенных файловых (SFTP) и веб (HTTPS)-серверов. Также утилита умеет скачивать мультимедиаконтент через потоковые протоколы (MMS, RTSP) и может использоваться для скачивания с файлообменных серверов (MySpace.com, iDrive.com и т.д.), однако она не поможет скачать флэш-видео с видеохостингов, в частности с YouTube. Утилита отображает размер скачиваемого файла еще перед закачкой, позволяет просматривать ZIP-архивы и скачивать их частично и умеет автоматически переключаться на более быстрые «зеркала».

ReGet Deluxe автоматически интегрируется в Internet Explorer и ряд его клонов, интеграция в часть браузеров осуществляется через плагины сторонних разработчиков. Встроенный FTP-браузер упрощает поиск нужных файлов на FTP-серверах. Загружаемые файлы могут автоматически раскладываться по разным папкам с учетом назначенной им пользователем категории, причем при использовании макросов допускается даже автоматическое создание нужных папок в соответствии с расширениями скачанных файлов, датой загрузки или именем сервера, с которого был скачан файл. При замедлении конкретной закачки утилита автоматически отключается от сервера и соединяется с ним снова, давая закачке стартовый толчок. Одновременно может загружаться несколько файлов - их количество (как и число потоков) зависит от типа соединения. В ходе скачивания утилита замечает активность браузера и автоматически понижает свой трафик при передаче браузером данных. По завершении скачивания она может автоматически разорвать интернет-соединение, запустить внешнее приложение, выключить компьютер и т.п.

Программа представлена в двух редакциях: ReGet Deluxe и ReGet Deluxe Personal, последняя не имеет мультиязычной поддержки и предназначена для использования только на домашнем компьютере. Утилита может работать в одном из трех режимов: упрощенном (в нем работают лишь базовые функции), расширенном и режиме эксперта, переключение между ними осуществляется при помощи команд главного меню.

Free Download Manager 3.0 build 848

Разработчик : Free Download Manager.ORG

Размер дистрибутива: 6,39 Мбайт

Работа под управлением: Windows 9x/Me/2000/2003/XP/Vista (только 32-битные версии)

Способ распространения: freeware (http://freedownloadmanager.org/download.htm)

Цена: бесплатно

Free Download Manager - полноценный и очень удобный менеджер закачки, позволяющий загружать файлы (в том числе по расписанию) с FTP- и HTTP-серверов, защищенных веб (HTTPS)-серверов, а также с популярных файлохранилищ и видеосервисов (YouTube, Google Video и др.). Возможна одновременная разгрузка от нескольких «зеркал». При скачивании видеоконтента допускается автоматическое преобразование FLV-файлов в другие видеоформаты с помощью встроенного перекодировщика видео. Предусмотрена частичная загрузка ZIP-архивов, скачивание файлов через сеть BitTorrent и целиком сайтов для их последующего просмотра в офлайне. Имеется также специальный Upload manager, обеспечивающий загрузку файлов в онлайновое хранилище WikiFortio (http://www.wikifortio.com/), где разрешается до месяца хранить файлы размером до 100 Мбайт.

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

Программа представлена в двух редакциях: стандартной Free Download Manager и облегченной Free Download Manager Lite. В последней нет поддержки протокола BitTorrent, а также отсутствуют встроенный видеоконвертор и менеджер закачки файлов на серверы. В обеих редакциях есть функционал для записи портативной версии, которая не требует установки и может быть записана на флэшку или внешний диск.

Orbit Downloader 2.8.13

Разработчик: OrbitDownloader

Размер дистрибутива: 2,17 Мбайт

Работа под управлением: Windows NT/2000/XP/2003/Vista

Способ распространения: freeware (http://www.orbitdownloader.com/download.htm)

Цена: бесплатно

Orbit Downloader - очень простой в применении, но достаточно функциональный и удобный менеджер закачки, отличающийся расширенной поддержкой социальных сервисов. Он позволяет загружать не только файлы по протоколам FTP и HTTP, но и разного рода потоковый флэш-, видео- и аудиоконтент через протоколы RTSP/MMS/RTMP с MySpace, YouTube, Imeem, Pandora и других подобных сервисов. Возможна загрузка файлов с файлообменных сервисов (включая Rapidshare, MegaUpload, 4shared, Depositfiles и пр.), а также проведение загрузки по технологии Metalink, позволяющей скачивать отдельные сегменты из сетей практически с любым протоколом. Скачивание медиаконтента с социальных сервисов реализовано в этой утилите через встроенный модуль Grab++, работающий только под Internet Explorer. Причем технология скачивания принципиально отличается от принятой в других download-менеджерах: если обычно менеджеру загрузки принято просто указывать ссылку вида http://www.youtube.com/watch?v=.., то модуль Grab++ определяет прямую ссылку при наведении указателя мыши на нужный ролик в окне его просмотра.

Программа интегрируется в популярные браузеры, причем поддержка нужных браузеров настраивается уже в ходе ее установки. Ограничение трафика производится вручную через настройки. Одновременно могут скачиваться несколько файлов - каждый в несколько потоков, число потоков регулируется, можно также изменить количество потоков для отдельно взятой закачки. Уточнить размер файла перед закачкой невозможно, равно как и частично скачать ZIP-архив, но разрешается просматривать содержимое ZIP-файла до его скачивания. Увеличение скорости закачки достигается не только за счет многопоточности, но и благодаря использованию технологии Orbitnet, базирующейся на Р2Р и автопоиске «зеркал». Уже закачанные файлы несложно перераспределить по разным папкам. По завершении скачивания утилита может проверить файл на вирусы встроенным антивирусом, автоматически разорвать интернет-соединение и выключить компьютер.

FlashGet 1.9.6

Разработчик : Trend Media Corporation Ltd

Размер дистрибутива: 4,43 Мбайт

Работа под управлением: Windows (все версии)

Способ распространения: freeware (http://www.flashget.com/en/download.htm?uid=undefined)

Цена: бесплатно

FlashGet - наверное, самый популярный в мире менеджер закачки файлов с наибольшей историей развития. Сегодня эта утилита по-прежнему достойна внимания благодаря удобству, простоте использования и высокой скорости скачивания, однако ее функционал устроит не всех пользователей, поскольку в большинстве своем он ограничен лишь базовыми возможностями. FlashGet позволяет скачивать файлы по протоколам HTTP/FTP/MMS/RTSP и вполне корректно распознает ссылки с Rapidshare. Однако в целом при работе с файловыми хостингами могут быть проблемы, а скачивание видео с видеохостингов вообще невозможно, равно как и частичная закачка ZIP-архивов. Вместе с тем в последней версии утилиты появилась возможность скачивания по протоколам BitTorrent и eMule, что предусмотрено далеко не в каждом download-менеджере.

FlashGet умеет интегрироваться в популярные браузеры, поддержка части из которых требует установки плагинов. Встроенные FTP- и HTTP-обозреватели упрощают поиск нужных файлов. Оптимальная скорость соединения указывается в настройках путем установки типа соединения, возможна установка ограничения трафика вручную выбором одного из трех предустановленных режимов. Скачиваемые файлы могут распределяться по разным папкам с учетом указанных пользователем категорий. Предусмотрен автоматический поиск «зеркал» и осуществление загрузки с самых быстрых и доступных серверов. Несложно настроить проведение скачивания в строго назначенное время, а по его завершении утилита может проверить файлы на вирусы и разорвать соединение.

ReGet Junior 2.2

Разработчик: ReGet Software

Размер дистрибутива: 1,66 Мбайт

Работа под управлением: Windows 95/98/Me/NT/2000/XP

Способ распространения: shareware (30-дневная демо-версия - http://download.reget.com/regetjr.exe)

Цена: 250 руб.

ReGet Junior - самый простой в применении download-менеджер, ориентированный на начинающих пользователей. Утилита обладает минимальным функционалом, и ее привлекательность заключается лишь в том, что разбираться с настройками не потребуется в принципе. Она позволяет загружать файлы с FTP- и HTTP-серверов и интегрируется в наиболее популярные браузеры. Скачивание ведется в несколько потоков, и одновременно могут загружаться несколько файлов; число потоков и одновременно скачиваемых файлов не регулируется.

Заключение

Итак, функционал download-менеджеров от разных разработчиков весьма схож - все они обеспечивают надежную и быструю закачку файлов из Сети. Поэтому многим домашним пользователям, работающим в наиболее популярных под Windows браузерах, вполне достаточно обзавестись для решения данной задачи одним бесплатным инструментом, например Download Master, Free Download Manager, ReGet Deluxe (в редакции Personal) или Orbit Downloader. Теоретически все они умеют скачивать разного рода информацию, включая файлы с серверов типа Rapidshare.com и, за исключением ReGet Deluxe, потоковый флэш-, видео- и аудиоконтент с YouTube и прочих социальных сервисов. Однако возможность захвата видео и flash наиболее полно реализована в Orbit Downloader, на который и стоит обратить внимание любителям закачки такого рода контента. Что касается FlashGet, то делать ставку на него, на наш взгляд, особого смысла не имеет в силу уступающей вышеназванным программам функциональности.

Выбор пользователей Google Chrome и Apple Safari скромнее - им придется воспользоваться Download Master, Free Download Manager или Orbit Downloader, поскольку в других рассмотренных download-менеджерах поддержка соответствующих браузеров отсутствует. При этом нужно иметь в виду, что закачкой медиаконтента с социальных сервисов в Orbit Downloader им воспользоваться не удастся, поскольку она работает только под Internet Explorer.

22/02/2018

Ещё один менеджер закачек, по своим функциям не уступающий более известным аналогам. Так, например, программа с успехом работает с протоколами http и ftp, успешно поддерживает докачку файлов, а также имеет встроенный планировщик, в котором можно задать не только время закачки, но и их количество, а также задать автоматическое выключение компьютера. Кроме этого, программа обладает приятным внешним видом, который, кстати, можно изменить с помощью скинов, а также понятным интерфейсом. Имеется здесь и плавающее окошко, в котором отображается информация о текущих загрузках, и возможность автоматического переименования файло...

03/07/2017

EagleGet - простой менеджер закачек, позволяющий скачивать любые файлы из интернета на высокой скорости, а также обладающий понятным интерфейсом, с которым может разобраться практически любой пользователь. Отличительной особенностью данной программы является то, что она автоматически настраивает параметры загрузки, исходя из возможностей и особенностей вашего Интернет-соединения. Кроме того позволяет вам не беспокоиться о том, что закачка будет прервана из-за неполадок. Программа сможет продолжить загрузку файла с того места, где она была прервана. Если, конечно, данная возможность поддерживается сайтом, с которого вы загружает...

27/06/2017

Download Master - один из популярнейших менеджеров закачек. Он отличается от других таких программ высокой продуктивностью и доступным для пользователя интерфейсом. Как считается, существует три проблемы при скачивании файлов из сети: скорость скачивания, продолжение прерванных закачек и управление уже скачанными файлами. Download Master решает их все. С помощью HTTP, HTTPS и FTP протоколов эта программа значительно повышает скорость скачивания из Интернета. Это достигается при помощи технологии разбивания файла на потоки информации, которые скачиваются в одно время. Если интернет соединение во время скачивания прерва...

12/05/2017

29/11/2016

Free Download Manager – бесплатный менеджер закачек, обладающий широкими возможностями. Данная программа может скачивать файлы на максимальной скорости, поскольку увеличивает её за счёт использования нескольких потоков загрузки, однако это далеко не все её функции. Прежде всего, следует отметить тот факт, что Free Download Manager является ещё и Torrent клиентов. Т.е. по сути это две программы в одной. Кроме того, данная программа обладает функцией скачивания сайтов целиком. Это бывает полезно, когда у вас не очень хороший интернет, да и оплата производится за время соединения, то иногда выгоднее скачать весь сайт сра...

27/11/2015

JDownloader - полезное приложение, предназначенное для быстрого скачивания медиа файлов, документов либо программ. Позволяет закачивать файлы в разы быстрее, чем с помощью загрузчик браузера. Все закачки можно ставить в свою очередь. Настройки программы позволяют запускать скачивание сразу после добавления ссылки. Работает на базе распространённой платформы Java. Отлично взаимодействует с популярными файлообменными хранилищами. Приложение вынимает ссылку на файл из сети и справляется с ограничителями скорости. Позволяет беспрепятственно скачивать информацию с файлообменников. Интерфейс менеджера закачек включает три закладки.

07/07/2015

Ninja Download Manager - весьма удобный менеджер закачек, с которым можно без особых трудностей загружать большие файлы. Программа позволяет останавливать или возобновлять загрузку файла, а также увеличивает скорость до максимально возможной. Приложение может автоматически перехватывать все ссылки, находящиеся в буфере обмена операционной среды. Ninja Download Manager позволяет перетаскивать файлы посредством drag&drop. Можно упорядочиваться загрузки по желанию пользователя. Возможность составления расписания помогает начинать либо останавливать загрузки без участия пользователя. Помимо этих функций Ninja Download Manager спосо...

16/03/2015

SD Download Manager – приложение для загрузки, скачивания различных файлов, документов из интернет-источников. Работает быстрее браузерного загрузчика, благодаря использованию до 32 активных подключений. Новый динамический алгоритм сжатия и скачивания данных делает загрузку документов и различных файлов быстрее в разы. Утилита помогает возобновить, прерванные по причинам, операции скачивания, а также взаимодействует с битыми ссылками. Поддерживает протоколы интернет-соединений HTTP, HTTPS, FTP-протоколы, брандмауэры, файл перенаправления авторизации. Использует захват загрузок с веб-браузера Mozilla Firefox, также проводит мон...

10/03/2015

DAM - создана для скачивания файлов с интернета. Может не только скачать отдельные файлы, а также скачивает музыку и видео с таких сайтов как например YouTube. Главная особенность программы в том что она многократно увеличивает скорость загрузки, по сравнению с базовым загрузчиком который присутствует в других браузерах. Поддерживается всеми популярными веб-браузерами, Firefox, IE, Chrome и т.д. Программа может планировать, восстанавливать и запускать остановленные загрузки. В отличие от других загрузчиков, не тратит время зря на бесполезные действия и сразу сохраняет файлы полностью, а не по частям. Не имеет какого либо шпионс...

18/11/2014

Большинство людей каждый день пользуются Интернетом. И очень часто приходится скачивать книги, фильмы, музыку, программы и так далее. Пользоваться обычными программами для загрузки, а тем более стандартными средствами - долго и неудобно. И именно для того, чтобы максимально повысить уровень работы в Интернете, были разработаны так называемые Менеджеры загрузок, то есть программы, предоставляющие необходимые средства. Одна из них (и наиболее популярная) - Download Accelerator Plus. Так в чем же заключается принцип работы программы? Скачиваемый файл буквально "разрезается" на части, и все они загружаются одновременно.

10/11/2014

DDownloads – это приложение, которое содержит в себе специальный каталог, выполняющий функции оперативного поиска, а также установки различных необходимых программ. Данный каталог представлен в виде определенного списка ссылок на разные бесплатные программы. Оснащен встроенным модулем, выполняющим автоматические функции по обновлению, что позволяет регулярно расширять и актуализировать ссылки. Каталог разделен на несколько категорий для удобного поиска. Для каждой из программ в DDownloads содержится описание и характеристики, информация по их рейтингу и о производителях. Размещенные ссылки позволяют скачать разные версии програ...

29/09/2013

Orbit Downloader – ещё один менеджер закачек с удобным интерфейсом и некоторыми уникальными возможностями. Программа способна скачивать файлы по всем стандартным протоколам, включая http, https, ftp, а также обладает функцией остановки и старта любой из закачек, если, конечно, данный способ поддерживается сервером. Программа имеет встроенный планировщик, позволяющий выполнять все закачки в указанное вами время, например, вы можете запланировать старт всех закачек на 2 часа ночи. Помимо этого в стандартные функции программы входит возможность многопоточной закачки, а также интеграция во все популярные браузеры.

17/06/2013

Мощная качалка файлов, заметно ускоряющая время загрузки файлов благодаря разбиению файла на несколько потоков. Программа умеет отсортировать файлы по типу, перехватить ссылки из буфера обмена, интернироваться в браузеры Google Chrome и Mozilla Firefox и т.д. Кроме этого в программе присутствует детектор ресурсов (встроенный компактный браузер), с помощью которого можно легко "перехватить" все имеющиеся файлы на указанной вами страницы. Естественно, предусмотрены импорт и экспорт списков заданий, а также поддержка прокси и даже создание и скачивание торрент файлов. Таким образом можно сказать, что FlashGet это универсальный мен...

Рассмотрев методы сжатия, объединения, кэширования и создания параллельных соединений, разумно было бы заняться следующим вопросом: Какая часть страницы должна загружаться вместе с основным HTML-файлом, а какая — только с внешними файлами?

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

Кроме того, были проведены теоретические выкладки для определения оптимального распределения загрузки по стадиям с учетом всех аспектов.

Реальная ситуация

Рис. 29. Диаграмма загрузки (неизмененного) сайта WebHiTech.ru

Основная идея вариации потока загрузки заключалась в создании минимального количества «белых мест» на диаграмме загрузки. Как видно из рис. 29, около 80% при загрузке страницы составляют простои соединений (естественно, что данный график не отражает реальную загрузку открытых в браузере каналов загрузки, однако, при уточнении картины ситуация практически не меняется). Параллельные загрузки начинаются только после прохождения «узкого места», которое заканчивается (в данном случае) после предзагрузки страницы — после CSS-файла.

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

Шаг первый: простая страница

Вначале бралась обычная страница, для которой использовалось только gzip-сжатие HTML-файла. Это самое простое, что может быть сделано для ускорения загрузки страницы. Данная оптимизация бралась за основу, с которой сравнивалось все остальное. Для тестов препарировалась главная страница конкурса WebHiTech (http://webhitech.ru/) с небольшим количеством дополнительных картинок (чтобы было больше внешних объектов, и размер страницы увеличивался).

В самом начале (head) страницы замеряется начальное время, а по событию window.onload (заметим, что только по нему, ибо только оно гарантирует, что вся страница целиком находится в клиентском браузере) — конечное, затем вычисляется разница. Но этот очень простой пример, перейдем к следующим шагам.

Шаг второй: уменьшаем изображения

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

Дополнительно с минимизацией картинок была уменьшена таблица стилей (через CSS Tidy) и сам HTML-файл (убраны лишние пробелы и переводы строк). Скриптов на странице не было, поэтому общее время загрузки изменилось не сильно. Но это еще не конец, и мы переходим к третьему шагу.

Шаг третий: все-в-одном

Можно использовать data:URI и внедрить все изображения в соответствующие HTML/CSS-файлы, уменьшив, таким образом, размер страницы (за счет gzip-сжатия, по большому счету, потому что таблица стилей перед этим не сжималась) еще на 15%, однако, время загрузки при этом уменьшилось всего на 4% (при включенном кэшировании, уменьшилось число запросов с 304-ответом). При загрузке страницы в первый раз улучшения гораздо более стабильны: 20%.

CSS-файл, естественно, тоже был включен в HTML, поэтому при загрузке всей страницы осуществлялся только один запрос к серверу (для отображения целой страницы с парой десяткой объектов).

Шаг четвертый: нарезаем поток

Можно попробовать распределить первоначальный монолитный файла на несколько (5- 10) равных частей, которые бы затем собирались и внедрялись прямо в document.body.innerHTML. Т.е. сам начальный HTML-файл очень мал (фактически, содержит только предзагрузчик) и загружается весьма быстро, а после этого стартует параллельная загрузка еще множества одинаковых файлов, которые используют канал загрузки максимально плотно.

Однако, как показали исследования, издержки на XHR-запросы и сборку innerHTML на клиенте сильно превосходят выигрыш от такого распараллеливания. В итоге, страница будет загружаться в 2-5 раз дольше, размер при этом изменяется не сильно.

Можно попробовать использовать вместо XHR-запросов классические iframe, чтобы избежать части издержек. Это помогает, но не сильно. Страница все равно будет загружаться в 2-3 раза дольше, чем хотелось бы.

И немного к вопросу применения фреймов: очень часто наиболее используемые части сайта делают именно на них, чтобы снизить размер передаваемых данных. Как уже упомянуто выше, основная часть задержек происходит из-за большого количества внешних объектов на странице, а не из-за размера внешних объектов. Поэтому на данный момент эта технология далеко не так актуальна, как в 90-е годы прошлого столетия.

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

Шаг пятый: алгоритмическое кэширование

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

В результате удалось уменьшить время загрузки еще на 5%, итоговое ускорение (в случае полного кэша) достигло 20%, размер страницы при этом уменьшился на 21%. Возможно вынесение не более 50% от размера страницы в загрузку внешних объектов, при этом объекты должны быть примерно равного размера (расхождение не более 20%). В таком случае скорость загрузки страницы для пользователей с полным кэшем будет наибольшей. Если страница оптимизируется под пользователей с пустым кэшем, то наилучший результат достигается только при включении всех внешних файлов в исходный HTML.

Итоговая таблица

Ниже приведены все результаты оптимизации для отдельной взятой страницы. Загрузка тестировалась на соединении 100 Кб/с, общее число первоначальных объектов: 23.

Номер шага

Описание

Общий размер (кб)

Время загрузки (мс)

1 Обычная страница. Ничего не сжато (только html отдается через gzip) 63 117
2 HTML/CSS файлы и картинки минимизированы 58 108
3 Один-единственный файл. Картинки вставлены через data:URI 49 104
4 HTML-файл параллельно загружает 6 частей с данными и собирает их на клиенте 49 233
4.5 HTML-файл загружает 4 iframe 49 205
5 Вариант #3, только JPEG-изображения (примерно одинаковые по размеру) вынесены в файлы и загружаются через (new Image()).src в head странице 49 98

Таблица 5. Различные способы параллельной загрузки объектов на странице

Шаг шестой: балансируем стадии загрузки

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

Что дальше? Дальнейшие действия зависят от структуры внешних файлов. При большом (больше двух) числе файлов, подключаемых в страницы, необходимо объединить файлы стилей и файлы скриптов. Ускорение предзагрузки страницы будет налицо.

Если объем скриптов даже после сжатия достаточно велик (больше 10 Кб), то стоит их подключить перед закрывающим , либо вообще загружать по комбинированному событию window.onload (динамической загрузке скриптов посвящено начало седьмой главы). Тут мы, фактически, переносим часть загрузки из второй стадии в четвертую, ускоряется лишь «визуальная» загрузка страницы.

Общее количество картинок должно быть минимальным. Однако тут тоже очень важно равномерно распределить их объем по третьей стадии загрузки. Довольно часто одно изображение в 50-100 Кб тормозит завершение загрузки, разбиение его на 3-4 составляющие способно ускорить общий процесс. Поэтому при использовании большого количества фоновых изображений лучше разбивать их на блоки по 10-20, которые будут загружаться параллельно.

Шаг седьмой: балансируем кэширование

Если все же на странице присутствует больше 10 внешних объектов в третьей стадии (картинок и различных мультимедийных файлов), тут уже стоит вводить дополнительный хост для увеличения числа параллельных потоков. В этом случае издержки на DNS-запрос окупятся снижением среднего времени установления соединения. 3 хоста стоит вводить уже после 20 объектов, и т.д. Всего не более 4 (как показало исследование рабочей группы Yahoo! после 4 хостов издержки, скорее, возрастут, чем снизятся).

Вопрос о том, сколько объема страницы включать в сам HTML-файл (кода в виде CSS, JavaScript или data:URI), а сколько оставлять на внешних объектах, решается очень просто. Баланс в данном случае примерно равен соотношению числа постоянных и единовременных посещений. Например, если 70% пользователей заходят на сайт в течение недели, то примерно 70% страницы должно находиться во внешних объектах и только 30% — в HTML-документе.

Когда страницу должны увидеть только один раз, логично будет включить все в саму страницу. Однако тут уже вступают в силу психологические моменты. Если у среднего пользователя страница при этом будет загружаться больше 3-4 секунд (учитывая время на DNS-запрос и соединение с сервером), то будет необходимо разбиение на две части: первоначальная версия, которая отобразится достаточно быстро, и остальная часть страницы.

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

Заключение

Вот так, на примере обычной страницы (уже достаточно хорошо сделанной, стоит отметить) мы добились ускорения ее загрузки еще на 15-20% (и это без учета применения gzip-сжатия для HTML, которое в данном случае дает примерно 10% от общей скорости). Наиболее важные методы уже приведены выше, сейчас лишь можно упомянуть, что при оптимизации скорости работы страницы лучше всегда полагаться на внутренние механизмы браузера, а не пытаться их эмулировать на JavaScript (в данном случае речь идет об искусственной «нарезке» потока). Может быть, в будущем клиентские машины станут достаточно мощными (или же JavaScript-движки — лучше оптимизированными), чтобы такие методы заработали. Сейчас же выбор один — алгоритмическое кэширование.