Какие селекторы или правила CSS могут существенно повлиять на производительность внешнего интерфейса/рендеринга в реальном мире?

Стоит ли беспокоиться о производительности рендеринга CSS? Или нам следует вообще не беспокоиться об эффективности CSS и вместо этого сосредоточиться на написании элегантного и удобного в сопровождении CSS?

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

Существующие доказательства

Google и Mozilla написали рекомендации по эффективному написанию CSS и набор правил CSSLint включает:

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

но ни один из них не предоставляет никаких доказательств (которые я мог найти) их влияния.

В статье css-tricks.com об эффективном CSS приводятся доводы (после описания множества лучшие практики эффективности), которые мы должны not .. sacrifice semantics or maintainability for efficient CSS в эти дни.

В совершенство убивает сообщение в блоге. border-radius и box-shadow отображались на несколько порядков медленнее, чем более простые правила CSS. Это имело огромное значение для движка Opera, но не имело значения для Webkit. Кроме того, отличный журнальный тест CSS обнаружил, что время рендеринга для правил отображения CSS3 было незначительным и значительно быстрее, чем рендеринг эквивалентного эффекта с использованием изображений.

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

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

Задний план

Я предложил вознаграждение за этот вопрос, чтобы попытаться использовать возможности сообщества SO для создания полезного хорошо изученного ресурса.


person Robin Winslow    schedule 05.09.2012    source источник
comment
Одно я могу с уверенностью сказать вам: используйте идентификаторы, когда следует использовать идентификаторы, и классы, когда следует использовать классы. Разница в производительности незначительна, семантика - нет. ID для элементов, которые по определению появляются только один раз; классы для тех, которые могут повторяться на протяжении всей страницы. Просто рассмотрите крайний случай, когда вы используете класс для fixed позиции CSS.   -  person Michał Górny    schedule 05.09.2012
comment
@MichałGórny Идентификаторы следует использовать в разметке там, где это уместно, но многие люди (включая меня) считают, что идентификаторы никогда не следует использовать в селекторах CSS. Прочтите эту статью (надеюсь, непредвзятую) в подробностях: com/2010/07/dont-use-id-selectors-in-css   -  person Robin Winslow    schedule 05.09.2012
comment
Что ж, эта статья согласна со мной в том, когда можно и нужно использовать идентификаторы. И мой крайний пример position: fixed — это пример, когда CSS просто нельзя использовать повторно. Не то чтобы я призываю делать что-то подобное.   -  person Michał Górny    schedule 05.09.2012
comment
Помните, что большинство браузеров уже пытаются максимально оптимизировать селекторы. Возьмите хорошо известный пример справа налево. сопоставление для каждого элемента. Большинство селекторов работают ровно настолько, насколько на вашей странице есть элементы. Если у вас есть очень простая страница только с тремя дочерними элементами body и больше ничего, любой селектор, который вы на нее набросите, не должен вызывать сбоев или даже зависания браузера.   -  person BoltClock    schedule 05.09.2012
comment
Кроме того, относится ли этот вопрос только/в основном к селекторам или ко всем аспектам CSS? Как вы знаете, производительность CSS зависит не только от селекторов. Браузеры должны беспокоиться о таких вещах, как компоновка, позиционирование, вычисление и рисование градиентов, альфа-композитинг и множество других вещей. И это рендеринг. Соответствие селектора не отображается; это просто выяснить, какие элементы каким образом отображать.   -  person BoltClock    schedule 05.09.2012
comment
@RobinWinslow Как ни странно, страница, которую вы упомянули в статье о Селекторы ID стилизуют элементы по ID много раз :)   -  person Chris    schedule 05.09.2012
comment
@BoltClock Меня интересуют все элементы стиля, которые могут значительно повлиять на производительность рендеринга. Хотя для селекторов легче определить лучшие практики, поэтому эти советы, вероятно, будут иметь наибольшую силу.   -  person Robin Winslow    schedule 05.09.2012
comment
У меня больше нет источника этой информации, но один сайт, который я читал месяц назад или около того, когда изучал мобильные устройства, утверждал, что определенные свойства CSS более затратны для рендеринга (т.е. потребляют больше времени автономной работы). Они упомянули 3 конкретных из них как худшие из них, но единственный, который запомнился мне как вероятный для использования с этим поколением браузеров, — это box-shadow.   -  person cimmanon    schedule 09.09.2012
comment
Это просто эталонный инструмент для ваших веб-сайтов, обычно я использую его для оптимизации своих веб-сайтов. Скорость страницы (от Google): chrome.google.com/webstore/detail/, браузер читает каждый тормоз, который вы делаете в вашем css, поэтому чем компактнее файл, тем лучше. множество инструментов, которые могут это сделать. Думал, я не знаю, какие теги работают лучше.   -  person Simon Dragsbæk    schedule 11.09.2012
comment
Мне нравится первое предложение статьи № 2 из поста Саймона Уэста ниже: вы, наверное, этого не заметили... Он прав: я этого не заметил. Я хотел, чтобы здесь была серебряная пуля — ее нет. Я предпочитаю писать меньше кода, больше семантического кода и сберечь миллисекунды для тех, у кого много свободного времени. Я не верю, что это селекторы или идентификаторы против классов - единственное, что, как я когда-либо находил, влияет на производительность, это размер файла и разрывы строк / количество в файлах CSS (даже те, которые раздуты селекторами классов, которые раздули разметку также). ‹-- возвращая нас к семантике.   -  person Dawson    schedule 11.09.2012
comment
Возможный дубликат Выбор эффективных селекторов на основе вычислительной сложности   -  person Oleg    schedule 15.09.2012


Ответы (6)


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

Прежде чем я перейду к ответу, позвольте мне пояснить ИМО: лично я категорически не согласен с заявленной потребностью в «доказательных данных». Это просто делает заявление о производительности кажущимся заслуживающим доверия, в то время как на самом деле область движков рендеринга достаточно разнородна, чтобы сделать любой такой статистический вывод неточным для измерения и непрактичным для принятия или мониторинга.

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


Начнем с производительности селектора:

Неглубокие, желательно одноуровневые, определенные селекторы обрабатываются быстрее. В отчетах отсутствуют явные показатели производительности. исходный ответ, но ключевой момент остается: во время выполнения HTML-документ анализируется в дерево DOM, содержащее N элементов со средней глубиной D, а затем применяется в общей сложности S правил CSS. Чтобы снизить вычислительную сложность O(N*D*S), вы должны

  1. Используйте крайние правые клавиши, соответствующие как можно меньшему количеству элементов — селекторы сопоставляются справа налево^ для соответствия отдельным правилам, поэтому, если крайний правый ключ не соответствует определенному элементу, нет необходимости в дальнейшей обработке селектора, и он отбрасывается.

    Принято считать, что селектора * следует избегать, но этот момент следует проработать дальше. На самом деле «нормальный» сброс CSS соответствует большинству элементов — когда эта SO-страница профилирована, сброс отвечает примерно за 1/3 всего времени сопоставления селекторов, поэтому вы можете предпочесть normalize.css (тем не менее, это всего лишь 3,5 мс — точка против преждевременной оптимизации стоит крепко)

  2. Избегайте селекторов потомков, так как они требуют повторения до ~D элементов. В основном это влияет на подтверждения несоответствия — например, для положительного совпадения .container .content может потребоваться только один шаг для элементов в отношениях родитель-потомок, но дерево DOM необходимо будет пройти до html, прежде чем можно будет подтвердить отрицательное совпадение.

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

  4. Удалить неиспользуемые правила с момента браузеру приходится оценивать их применимость для каждого отображаемого элемента. Достаточно сказать - самое быстрое правило - это то, которого нет :)

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


Далее производительность свойств CSS3:

CSS3 принес нам (среди прочего) закругленные углы, фоновые градиенты и вариации теней — а вместе с ними и кучу проблем. Подумайте об этом, по определению предварительно обработанное изображение работает лучше, чем набор правил CSS3, который должен быть отрисован первым. Из вебкит-вики:

Градиенты, тени и другие украшения в CSS следует использовать только в случае необходимости (например, когда форма является динамической в ​​зависимости от содержимого) — в противном случае статические изображения всегда работают быстрее.

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


Далее производительность спрайта:

Избегайте высоких и широких спрайтов, даже если их трафик относительно невелик. Обычно забывают, что движок рендеринга не может работать с gif/jpg/png, а во время выполнения все графические ресурсы обрабатываются как несжатые растровые изображения. По крайней мере, это легко вычислить: ширину этого спрайта умноженная на высоту, умноженная на четыре байта на пиксель (RGBA), равна 238*1073*4≅1MB. Используйте его для нескольких элементов на разных одновременно открытых вкладках, и это быстро принесет значительную пользу.

Довольно крайний случай, когда был обнаружен на сайте mozilla webdev., но это вовсе не неожиданно, когда используются такие сомнительные методы, как диагональные спрайты используются.

В качестве альтернативы можно рассмотреть отдельные изображения в кодировке base64, встроенные непосредственно в CSS.


Далее перекомпоновываем и перерисовываем:

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

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


Я внесу правки, если вспомню что-то важное, что было упущено. Некоторые ссылки, чтобы закончить с:

http://perfectionkills.com/profiling-css-for-fun-and-profit-optimization-notes/

http://jacwright.com/476/runtime-performance-with-css3-vs-images/

https://developers.google.com/speed/docs/best-practices/payload

https://trac.webkit.org/wiki/QtWebKitGraphics

https://blog.mozilla.org/webdev/2009/06/22/use-sprites-wisely/

http://dev.opera.com/articles/view/efficient-javascript/< /а>

person Oleg    schedule 15.09.2012
comment
Я, конечно, согласен с тем, что область движков рендеринга неоднородна, но это не кажется причиной не иметь статистики. Как фронтенд-разработчик может определить относительную ценность основных принципов по сравнению с удобством сопровождения/читабельности, не опираясь на некоторую статистику? Просто потому, что поле разнообразно и постоянно меняется, это не повод действовать без доказательств. - person Robin Winslow; 17.09.2012
comment
@RobinWinslow: вы неправильно истолковываете мой ответ - я не поддерживаю поиск доказательных данных, когда исходная логика обработки легко доступна для анализа вместо этого. Например, вы хотите возразить против чрезмерно определенных селекторов — вы можете запустить сотни тестов, на которые в конечном итоге влияет браузер и его версия, аппаратное обеспечение системы, особенности тестового примера... или вы можете прочитать обработку RTL и увидеть, что такие селекторы будут увеличивать нагрузку на обработку независимо от того, сколько оптимизаций вводит движок браузера. - person Oleg; 18.09.2012
comment
TL;DR: не анализируйте результаты, анализируйте модель. Во всяком случае, я предупреждал вас, что это было ИМО;) - person Oleg; 18.09.2012

Хотя это правда, что

10 лет назад компьютеры были намного медленнее.

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

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

Расширяя это, я не смог найти конкретной информации, касающейся более современных браузеров или мобильных устройств, которые борются с неэффективными селекторами CSS, но я смог найти следующее:

  1. http://www.stevesouders.com/blog/2009/03/10/performance-impact-of-css-selectors/

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

  2. http://www.thebrightlines.com/2010/07/28/css-performance-who-cares/

    Опять же довольно устаревший (IE8, Chrome 6), но доходит до крайностей в неэффективных селекторах CSS * * * * * * * * * { background: #ff1; }, чтобы установить снижение производительности.

person Simon West    schedule 05.09.2012
comment
+1 за упоминание о распространении устройств, но хотя смартфоны менее мощные, механизмы рендеринга стали намного эффективнее. Я особенно приветствовал бы конкретные примеры проблем с рендерингом, с которыми борются смартфоны. - person Robin Winslow; 05.09.2012
comment
Мне не удалось найти в Интернете какие-либо примеры мобильных браузеров, борющихся с рендерингом на основе неэффективных селекторов, но мне удалось найти пару немного устаревших примеров, в которых люди пытались фактически поставить некоторые числа в различные неэффективные селекторы CSS, я обновил свой ответ соответственно и, надеюсь, вы найдете его полезным. - person Simon West; 05.09.2012
comment
круто, это именно те ресурсы, которые я искал. Кажется, основные выводы из этих двух статей заключаются в том, что даже если вы действительно пытаетесь создавать неэффективные запросы, разница будет незначительной, а это именно тот вывод, который я искал. Было бы здорово, если бы мы могли найти какие-либо тесты, включая мобильные устройства. Я собираюсь оставить этот вопрос открытым на некоторое время, чтобы посмотреть, что могут придумать другие люди, но это определенно лучший вариант ответа. - person Robin Winslow; 05.09.2012

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

В этом случае отсутствие доказательств является свидетельством отсутствия проблем. Итак, используйте семантическую разметку (особенно OOCSS) и сообщайте обо всех замедлениях, которые вы обнаружите при использовании стандартных селекторов CSS в малоизвестных браузерах.

Люди из будущего: проблемы с производительностью CSS в 2012 году уже остались в прошлом.

person alexfernandez    schedule 13.09.2012

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

Как я уже говорил, используйте pagespeed для chrome, это инструмент Google, который анализирует веб-сайт по 27 параметрам, css — один из них.

Мой пост касается именно того, что не хотелось бы, чтобы около 99% веб-пользователей могли открыть веб-сайт и увидеть его правильно, даже люди с IE7 и тому подобным. Чем сократить около 10% с помощью css3 (если окажется, что вы можете получить дополнительные 1-10 мс на производительность).

У большинства людей есть по крайней мере 1 Мбит / 512 Кбит или выше, и если вы загружаете тяжелый сайт, загрузка занимает около 3 секунд, но вы можете сэкономить 10 мс, может быть, на CSS ??

И когда дело доходит до мобильных устройств, вы должны создавать сайты только для мобильных устройств, поэтому, когда у вас есть устройство с размером экрана меньше, чем «Ширина» пикселей, у вас есть отдельный сайт.

Пожалуйста, прокомментируйте ниже, это моя точка зрения и мой личный опыт веб-разработки.

person Simon Dragsbæk    schedule 11.09.2012
comment
Эти методы работы хорошо известны и приняты. Этот вопрос касается производительности рендеринга. Учитывая, что проблемы рендеринга менее важны, чем проблемы передачи, я пытаюсь выяснить, насколько важна производительность рендеринга и насколько сложными должны быть селекторы или правила рендеринга, прежде чем это станет иметь значение. Спасибо, что добавили свой голос, это не имеет никакого значения, но в остальном этот ответ на самом деле не способствует дискуссии. - person Robin Winslow; 11.09.2012
comment
Это способствует тому, что все устройства работают слишком быстро с процессом рендеринга, и нет смысла вникать в него, если только вы не используете изображения с разрешением 150 точек на дюйм или выше, что не имеет значения, поскольку в Интернете отображается только разрешение 72 точки на дюйм. И я мог бы добавить, что если вы можете визуализировать 3D в браузере, 2D будет намного быстрее, чем заботиться. Но надеюсь, вы найдете доказательство того, что это значительно быстрее, я добавил в избранное в этом вопросе. - person Simon Dragsbæk; 11.09.2012
comment
Итак, ваш комментарий о 150 dpi — это именно то, что я ищу, но мне нужны доказательства, а не просто ваше утверждение: свидетельство того, что 150 dpi имеет значение, и доказательство того, что другие проблемы рендеринга не являются проблемой. проблема. Я лично считаю, что должны быть некоторые веб-сайты, дизайн которых настолько сложен, что рендеринг CSS происходит, по крайней мере, немного медленно, по крайней мере, на мобильных устройствах. - person Robin Winslow; 11.09.2012
comment
Я понимаю, к чему вы клоните, но все же это только 72 dpi в Интернете, но для рендеринга 150 вам нужно рендерить вдвое больше пикселей. Если вы добавите скорость загрузки к времени рендеринга, у вас может быть случай, например, если вы сделаете закругленные углы с помощью css 3 или css 2, тогда у вас будет время загрузки + время рендеринга по сравнению с просто рендерингом. - person Simon Dragsbæk; 11.09.2012


person    schedule
comment
Боюсь, я надеялся получить более подробный ответ, чем этот (я, вероятно, добавлю награду, когда смогу через пару дней, если у меня не будет отличного ответа). Очевидно, это зависит от механизма рендеринга, но неудивительно, что меня особенно интересует, как работают последние версии Webkit (Chrome/Safari), Gecko (Firefox) и Trident (IE) (и, в меньшей степени, Presto). А что касается вашего общего мнения о том, что производительность рендеринга не имеет значения, вы уверены, что это применимо к сложным запросам CSS3, таким как регулярные выражения, упомянутые в моем вопросе? - person Robin Winslow; 05.09.2012
comment
@RobinWinslow Дело не в том, что это не имеет значения; вы просто не можете оптимизировать его, изменяя незначительные вещи (например, «избегая идентификаторов»). Регулярные выражения не так опасны, как вы думаете — опять же, не забывайте, что вы имеете дело со строками, длина которых почти никогда не превышает 10 символов. С другой стороны, отказ от использования более сложных селекторов, когда это возможно, дает вам: A) более чистый файл CSS. B) повышение производительности. Если бы идентификаторы были настолько отстойными, как утверждают некоторые статьи, спецификация CSS не включала бы их. - person Chris; 05.09.2012
comment
@Abody Я действительно не хочу обсуждать, следует ли вам использовать идентификаторы, потому что это не по теме, но вы не можете предположить, что спецификация CSS была безупречной? В ответ на A) да, это делает CSS чище (что хорошо), но еще раз я конкретно спрашиваю о влиянии на производительность. Я все еще приветствовал бы некоторые конкретные примеры людей, которые действительно измеряют производительность рендеринга. - person Robin Winslow; 05.09.2012
comment
@RobinWinslow Хорошо, я обновил ответ, указав фактические результаты теста. - person Chris; 10.09.2012
comment
@BoltClock Я могу провести больше тестов, если это необходимо. - person Chris; 10.09.2012
comment
@RobinWinslow Я также добавил ссылку на тесты, если вы хотите проверить себя. - person Chris; 10.09.2012
comment
Я нахожу удивительным, что и Firefox, и IE превосходят Chrome (довольно значительно) практически во всех этих тестах. Firefox также должен иметь действительно хороший движок рендеринга, чтобы значительно превзойти Chrome и IE в последних двух тестах. - person Sean; 13.09.2012
comment
@SeanDunwoody Меня это тоже удивило. Пару недель назад я провел некоторое тестирование JavaScript, и Chrome оказался намного быстрее, чем Firefox и IE (хотя Firefox был быстрее, чем IE). Странно, что у Chrome хуже производительность CSS-рендеринга. Однако я не тестировал ни в одном другом браузере WebKit, поэтому не знаю, связана ли проблема с WebKit или Chrome. - person Chris; 13.09.2012
comment
Да, я знаю, что Chromes JavaScript Engine уничтожает практически любой другой движок (с возможностью, возможно, IonMonkey). Я думаю, что это НАМНОГО важнее (и заметно) и популярные сайты, такие как Facebook, Google и т. д., которые очень интенсивно используют JavaScript. ; поэтому они, возможно, немного пренебрегли своим движком CSS. - person Sean; 13.09.2012
comment
@SeanDunwoody Да. Я предполагаю, что дело здесь в том, что наиболее распространенные селекторы CSS достаточно быстры во всех браузерах (100 мс — это не так уж и плохо), если вы не занимаетесь неохотной фантазией, например, используете сложные селекторы для выбора больших наборов элементов. Самое главное, чтобы ваш CSS имел смысл. Если вы создаете страницу чата и хотите оформить сообщения, а все сообщения divs имеют title. Можно было бы сделать: .chatpage div[title], но, безусловно, лучше просто присвоить всем сообщениям класс, а затем стилизовать их с помощью .message. Это проще, удобнее в обслуживании и эффективнее. - person Chris; 13.09.2012
comment
@Abody97: это еще более впечатляет после проверки вашего профиля. +1 - person Oleg; 16.09.2012
comment
Только что наткнувшись на это, я нахожу эти тесты довольно странными. Как вы думаете, почему этот метод измерения времени фактически измеряет то, что вы хотите измерить? Тот факт, что скрипт находится в ‹head› и непосредственно перед концом документа, не обязательно означает, что между ними происходит обработка компоновки CSS. Я предполагаю, что причина, по которой эти цифры немного странные, заключается в том, что, по крайней мере, Firefox просто выполняет сценарии независимо от разметки CSS. Это объясняет, почему он получает почти постоянные результаты. Надежно измерить время, необходимое для создания «визуально завершенной» страницы, вероятно, будет сложно. - person Simon Lehmann; 30.04.2013