15/04/2008 03:00 | Сергей Хлюпин

Вся правда о работе Firefox 3

Фрагментация памяти, работа с циклами, работа с кэш-памятью

Каждый день, работая над нашим сайтом, мы просматриваем статистику посещаемости, популярности материалов и т. д. В частности очень любопытно было узнать, какие браузеры используют наши читатели. Первое место по праву занимает Opera 9, следом идут соответственно IE 6 и IE 7, далее Opera Mini, и только потом Firefox 3. Мы задумались, почему так сложилось? Вызвано ли это тем, что третий «Огненный Лис» все еще пребывает в стадии бета-тестирования, или пользователям просто не хочется пересаживаться за новую программу, если «и так все работает»? Возможно, это так и есть, но не стоит бояться страшного слова «бета», ибо практически у половины нашей редакции стоит последняя версия Firefox 3, и никто вроде бы не наблюдает каких-то глюков. А по части поддерживаемых надстроек и скорости работы он совершенно точно даст фору всеми любимому Internet Explorer. Наткнувшись недавно на блог одного из разработчиков Firefox, мы посчитали, что в целях приобщения нашей аудитории к качественным продуктам было бы неплохо привести на нашем сайте одну его интересную запись о том, как новый браузер использует оперативную память. Вот о чем он пишет:

По мере развития Сети и браузеров, которые помогают осваивать ее бескрайние просторы, люди стали ожидать от них все новых и новых возможностей. Знаковым событием в этом развитии стало появление браузера Firefox от Mozilla Foundation. До этого мало кто пользовался вкладками и различными аддонами, которые, как выяснилось, существенно облегчают жизнь «серферам».  

Так как Firefox 2 использовал меньше памяти, чем его предшественник, Firefox 1.5, число изменений в движке Gecko, на котором работает Firefox, было сознательно ограничено (Gecko 1.8.1 не сильно отличался от Gecko 1.8). Однако, несмотря на то, что большинство пользователей устроил Firefox 2.0 / Gecko 1.8.1, разработчики на стали останавливаться на достигнутом и вовсю работали над новым Firefox 3 «Gran Paradiso» на основе Gecko 1.9.

Gecko на этот раз претерпел серьезные модификации (даже сами разработчики не берутся их подсчитать). А объем используемой памяти стал еще меньше. Оценить старания Mozilla Corporation можно, скачав последнюю, 5-ю, бета-версию Firefox 3, однако далее в тексте близко рассматриваться будет только 4-я. Давайте теперь посмотрим на то, чего удалось добиться разработчикам.

Уменьшена фрагментация памяти

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

 Фрагментация памяти в Firefox 3 снижена на треть

Различные распределители фрагментируют память неодинаково. Тщательно изучив этот аспект, было выяснено, что распределитель jemalloc при длительной работе с браузером фрагментирует память меньше всех остальных. Для того чтобы «прикрутить» этот распределитель к «Файрфоксу», разработчики совместно с его создателем Джейсоном Эвансом (Jason Evans) оптимизировали код для своих нужд (получается, в общем-то, не только своих — нам, простым смертным, будет это полезно, как никому другому). За 2 месяца была проделана поистине титаническая работа — код программы Джейсоном был увеличен в два (!) раза. И доработанный jemalloc появился уже в Firefox Beta 4 (под Windows и Linux). Как показывают тесты в Windows Vista, при использовании jemalloc объем задействованной памяти упал сразу на 22%!

Исправлена работа с циклами

При работе над программой всегда встречаются некоторые проблемы, которые намного сложнее решить, чем другие. Так вот, особую трудность вызывают такие ситуации, когда два объекта жестко зависят друг от друга. Речь идет о циклах. В предыдущих версиях Firefox’a код для управления циклами, как говорят разработчики, был слишком запутан и работал далеко не идеально, к тому же требовал участия в этом процессе пользователя. В Gecko 1.9 встроен автоматический сборщик циклов, который распознает циклы в объектном графе и сам их прерывает. Это значительно упрощает программу, а нам известно, что успех как раз и кроется в простоте. Раньше различные типы файлов грузили программу своими циклами из-за того, что имели доступ ко всем программным модулям. Теперь же ситуация кардинально изменилась.

Оптимизирована работа с кэш-памятью

Для обеспечения стабильной работы Firefox использует различную кэш-память: кэш для хранения изображений, кэш для просмотренных страниц, благодаря которому мы листаем страницы вперед/назад, кэш для шрифтов, ускоряющий их отрисовку и т.д. Разобрав, как на деле используются временные хранилища браузеров, разработчики добавили политики, определяющие срок хранения данных, что в большинстве случаев дает прирост производительности, не съедая при этом лишнюю память. Теперь просмотренные страницы, к которым можно вернуться с помощью кнопок Back и Forward, автоматически удаляются спустя полчаса с момента их последнего просмотра, так как к этим страницам пользователь уже вряд ли обратится снова. «Срок хранения» кэша для шрифтов и обработанных кусков текста отныне тоже жестко ограничен.

Проблема хранения изображений, утечки памяти, результаты

Решена проблема хранения изображений

В Firefox 3 значительно улучшена работа с изображениями. Изображения в Сети размещаются в сжатых форматах (GIF, JPEG, PNG и т.д). При их загрузке браузер их «разжимает» и отправляет на хранение в память. В Firefox 2 память хранила даже картинки во вкладках, к которым пользователь не обращался несколько часов. Что же касается Firefox 3, то здесь с несжатыми изображениями дела обстоят по-другому: Федерико Мена-Квинтеро (Federico Mena-Quintero — разработчик знаменитого GNOME) сделал так, чтобы картинки автоматически вычищались из памяти через некоторое (совсем небольшое) время. Причем это касается не только тех картинок, что находятся в фоновых вкладках, но и кэш-памяти, которая не задействована в просмотре какого-либо документа. В памяти теперь не будут валяться в буквальном смысле бесхозные картинки в несколько мегабайт.

Но и это еще не все. Автор многих дополнений к Firefox, Альфред Кейсер (Alfred Kayser), изменил принцип хранения GIF-файлов, сделав так, что теперь они занимают куда меньше места, чем раньше. Анимированные изображения отныне хранятся в 8-битной кодировке с цветовой палитрой, вместо 32-битной. В одном из тестов при просмотре экстремальной по размерам анимации, обычно отъедающей 368 МБ, было потрачено всего-навсего 108 МБ — экономия 260 МБ!

Утечки памяти

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

В итоге разработчиками были исправлены многие дыры, начиная с DOM (объектных моделей документов), которые «утекали» из Gmail, пока пользователь не покидал сайт,  и заканчивая целыми окнами, содержимое которых «утекало» в момент их закрытия. В общем и целом программистам удалось поставить заплатки на более чем 400 брешей.

Результаты

Сравнительный график потребление памяти Firefox 3, Firefox 2 и IE7

В результате, после проведенных работ и последующего тестирования были получены следующие результаты:

  • Firefox 3, в отличие от остальных испытуемых, не задействует все больше и больше памяти под свою работу
  • Конечная точка кривой Firefox 3 на 140 МБ ниже, чем у Firefox 2 — экономия 60%!
  • Даже после закрытия всех окон IE7 не отдает ни одного мегабайта памяти обратно
  • Разница в конце теста между Firefox 3 и IE7 … — 400 МБ!

Firefox 3 стал значительно компактнее, прежних версий «Огненного лиса» и других браузеров. Пользователю больше не стоит беспокоиться о том, что программа работает слишком долго и потребляет лишнюю память.А надстройки перестали быть причиной утечек памяти. Без сомнений, разработчики постарались на славу, и за счет упрощения кода и уменьшения «веса» браузера разработчикам удалось добиться нешуточного прироста производительности.

© Сергей Филимонов, 2008, специально для Cyberstyle.ru
© Cyberstyle.ru по материалам Blog.pavlov.net

Комментарии: