Поисковая оптимизация кода сайта – это раздел SEO, направленный на улучшение удобства использования сайта посетителями и представления данных для анализа поисковыми системами независимо от качества контента сайта и упоминаний о сайте на других ресурсах.
Оптимизацию кода можно разделить на два основных раздела: SEO-оптимизация кода и оптимизацию скорости загрузки сайта.
Внимание!!!
Перед выполнением любых изменений на сайте, сделайте его полную резервную копию!!!
SEO-оптимизация кода страницы сайта:
SEO-оптимизация кода используется для понимания кода сайта поисковыми системами, распределения значимости фрагментов страницы, улучшения представления сайта в результатах поиска и вывод сайта в ТОП выдачи с приоритетом на наиболее эффективные ключевые фразы.
Оптимизация структуры страницы сайта:
Данные, используемые на странице, распределяются по степени важности и уровня конкуренции среди других сайтов следующим образом:
- Заманивающая ключевая фраза страницы располагается в блоке <title>Заманивающая ключевая фраза</title>
- Заманивающее описание информации о странице располагается в блоке <meta name=»description» content=»Заманивающее описание информации о странице «>
- Самая важная ключевая фраза располагается в теге <h1> как можно ближе к началу страницы.
- Самая важная информация страницы располагается сразу под заголовком <h1>
- Заголовки <h2-6> и тексты после этих заголовков используются для привлечения трафика по менее важным (частотным) уточняющим вариантам главной ключевой фразы страницы
- На странице сайта обязательно должен быть <title>, <meta name=»description» content=»»> и хотя бы один из заголовков (<h1>,<h2>,<h3>,<h4>,<h5> или <h6>)
- Блоки ссылок, содержащие информацию, которая не соответствует теме страницы или просто не должна попасть в сниппет поисковой выдачи по данной странице, необходимо располагать выше (если смотреть на код страницы, а не на то как это выглядит для посетителя страницы) всех заголовков <h1-6> либо ниже всех заголовков, после заголовка, не соответствующего тематике страницы.
- Заголовков h1 может быть несколько, хотя, многие оптимизаторы посчитают это заявление бредом, но поисковые системы заявляют, что это не запрещено. Пример использования: сайт Сбербанка.
- Заголовки h2-6 могут быть выше заголовка h1, либо находиться на странице вообще без заголовков h Пример использования: сайт Авито.
- Для формирования заголовка сниппета информация берётся из следующих источников в порядке приоритета, начиная с максимального: <title>, <h1>, <h2>, <h3>, <h4>, <h5>, <h6>. Если сайт зарегистрирован в Яндекс Каталоге, то заголовок и описание сниппета подтянутся на главную страницу сайта с большим приоритетом, чем информация на сайте. Отменить формирование данного сниппета можно тегом <meta name=»robots» content=»noyaca»/> в блоке <head>.
- Для формирования описания сниппета, приоритет отдаётся части текста, содержащей текст, наиболее соответствующий ключевой фразе, после соответствующего запросу заголовка <h1-6> и до следующего заголовка h не соответствующего заголовку, либо из блока <meta name=»description» content=»»>
- Различные поисковые системы руководствуются различными алгоритмами формирования сниппета: Яндекс отдаёт предпочтение контенту в блоке <body>, Google в большинстве случаев формирует сниппет из блоков title и description в блоке <head>.
- Поисковая система Яндекс, при наличии других вариантов, никогда не сформирует сниппет, заголовок которого дублирует начало описания сниппета.
- Распространённые знаки, которые разрывают фрагменты текста при формировании сниппета (как заголовка сниппета, так и его описания), записанные в кавычках и через запятую: «.», «|»
- Распространённые знаки, которые не разрывают фрагменты текста, но уменьшают значимость последующего текста при формировании сниппета (как заголовка сниппета, так и его описания), записанные в кавычках и через запятую: «,», «–», «(», «)», «:»
Оптимизация изображений на сайте:
- После размещения изображения на сайте, добавьте атрибуты alt и title: <img src=»../foto.jpg» alt=»текст, который появится, если не загрузится картинка» title=»текст, который появится при наведении»>
Защита сайта от воровства контента
Блок, предотвращающий выделение текста на сайте:
<style>
html{-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}
</style>
Скачать
Блок, предотвращающий вызов контекстного меню на странице сайта:
<script>
//<![CDATA[
document.ondragstart = function() { return false;}
function nocontext(e) {
return false;
}
document.oncontextmenu = nocontext;
/* ]]> */
</script>
Скачать
Увеличение скорости загрузки сайта:
Скорость загрузки сайта – это очень важный фактор ранжирования, и чем сайт загружается быстрее, тем он будет выше в выдаче поисковиков. Для проверки скорости загрузки сайта используйте сервис компании Google на странице //developers.google.com/speed/pagespeed/insights/
Оптимизация CSS:
Для сокращения времени загрузки страницы оптимизируйте таблицу стилей CSS:
- Скопируйте коды различных страниц вашего сайта внутри блока <body…>…</body>
- Разместите все коды в одном текстовом редакторе или в Excel
- Удалите в получившемся документе всё кроме указания классов (.) и айдишников (#) стилей
- Удалите в таблице стилей все стили, которых не нашлось на страницах сайта
- Если получилась таблица стилей, которая отображает страницу хуже, чем было до удаления стилей, то добавьте старую версию таблицы стилей к новой версии прямо в браузере, выбрав таблицу стилей на вкладке Sources браузера Гугл хром, вызываемой из контекстного меню сайта пунктом «Просмотреть код» и удаляйте добавленную таблицу по строкам пока чтобы найти строку, отвечающую за необходимый вид страницы.
- После получения максимально короткого файла удалите переводы строк и пробелы рядом со следующими знаками (в кавычка и через запятую): «{», «}», «,»
- Удалите из блока <head> ссылку на таблицу стилей
- Создайте в блоке <head> блок <style>…</style>
- В блоке <style> разместите текст полученной таблицы стилей
Оптимизация JavaScript:
Оптимизацию кода JavaScript можно произвести и без знания JavaScript! Для этого удаляйте блоки между фигурных скобок разделов function и каждый раз после сохранения изменений наблюдайте за изменениями на сайте. Если изменений не произошло или изменения, которые произошли вас устраивают, переходите к следующему блоку. Если изменения вас не устраивают, восстановите фрагмент из предварительно созданной резервной копии сайта.
Для того, чтобы сократить время загрузки страницы, стоит подгружать скрипты асинхронно, и тогда время загрузки скриптов вообще не повлияет на время загрузки страницы.
Для того чтобы JavaScript загружался асинхронно, необходимо добавить тег defer=»defer» или async=»async» в блок вызова скрипта <script async=»async» src=»example.js»></script>
- async=»async» – асинхронная загрузка без соблюдения приоритета загрузки файлов JavaScript
- defer=»defer» – асинхронная загрузка с соблюдением приоритета загрузки файлов JavaScript
Если вы делаете сайт на WordPress, используйте плагин Async JavaScript
Сжатие изображений на сайте:
Для сжатия групп изображений используются сервисы, например, kraken.io
Если в таком сервисе изображение не будет сжато, скорее всего проблема в несоответствии формата изображения и расширения файла. Для того чтобы изменить формат файла загрузите изображение в стандартную программу paint и выполните следующие шаги:
- Нажмите кнопку «файл»
- Наведите курсор на кнопку «сохранить как» и всплывёт вкладке с выбором формата сохранения
- Выберите формат изображения
- Введите имя файла, место сохранения изображения и нажмите кнопку сохранить
Кэширование страниц сайта:
Включите кэширование сайта, добавив блок в начало файла htaccess:
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpg «access 1 year»
ExpiresByType image/jpeg «access 1 year»
ExpiresByType image/gif «access 1 year»
ExpiresByType image/png «access 1 year»
ExpiresByType text/css «access 1 month»
ExpiresByType text/html «access 1 month»
ExpiresByType application/pdf «access 1 month»
ExpiresByType text/x-javascript «access 1 month»
ExpiresByType application/x-shockwave-flash «access 1 month»
ExpiresByType image/x-icon «access 1 year»
ExpiresDefault «access 1 month»
</IfModule>
Скачать
Для включения кэширования и уменьшения времени ответа сервера у сайта на WordPress можно кэшировать страницы с помощью плагина W3 Total Cache. Данный плагин сложнее других в настройке, но самый эффективный из всех, что я пробовал.
Оптимизация WordPress:
Оптимизация базы данных WordPress
После выполнения всех работ, описанных выше, почистите базу данных, если используете WordPress с помощью плагина WP DB Booster. Данный плагин работает хорошо, но съедает в процессе работы много ресурсов, так что, после выполнения очистки, деактивируйте его.
Настройка плагина W3 Total Cache
Поставьте галочки на следующих пунктах настройки плагина:
Раздел General Settings
- Page Cache:
- Validate timestamps:
- Object Cache:
- Browser Cache:
- Verify rewrite rules
После проставления галочек сохраните настройки.
Раздел Page Cache
- Cache posts page
- Cache feeds: site, categories, tags, comments
- Cache SSL (https) requests
- Don’t cache pages for logged in users
- Automatically prime the page cache
- Preload the post cache upon publish events
- Front page
- Posts page
- Post page
- Blog feed
- rss2 (default)
- Handle XML mime type
После проставления галочек сохраните настройки.
Раздел Object Cache
- Enable caching for wp-admin requests
- Store transients in database
Раздел Browser Cache
- Set Last-Modified header
- Set expires header
- Set cache control header
- Set entity tag (ETag)
- Set W3 Total Cache header
- Enable HTTP(gzip) compression
- Prevent caching of objects after settings change
- Don’t set cookies for static files
- Do not process 404 errors for static objects with WordPress
- Set Last-Modified header
- Set expires header
- Set cache control header
- Set entity tag (eTag)
- Set W3 Total Cache header
- Enable HTTP(gzip) compression
- Prevent caching of objects after settings change
- Disable cookies for static files
- Set Last-Modified header
- Set expires header
- Set cache control header
- Set entity tag (ETag)
- Set W3 Total Cache header
- Enable HTTP(gzip) compression
- Set Last-Modified header
- Set expires header
- Set cache control header
- Set entity tag (ETag)
- Set W3 Total Cache header
- Enable HTTP(gzip) compression
- Prevent caching of objects after settings change
- Disable cookies for static files
- Referrer Policy
После проставления галочек сохраните настройки.
Скачать
prodvijenie-saijtov.ru
Оптимизация HTML-кода
Для того чтобы HTML-код способствовал быстрой загрузке сайта, он должен соответствовать нескольким условиям:
- Быть простым и информативным. Проверив его на валидность, нужно исправить ошибки, чтобы ботам было легче анализировать его. Код должен четко представлять структуру страницы.
- Основные составляющие страниц, такие как заголовки, указатели, блоки информации должны быть легко и быстро определяемы.
- Освобождение кода от лишних сведений, вынесение их в отдельные файлы (например, можно вынести CSS и JS), повысит скорость загрузки, что также упрощает работу ботов.
Добившись выполнения этих условий, сайт можно сделать более быстрым, удобным и повысить эффективность индексации его ботами поисковых систем.
Уменьшение объема кода и оптимизация CSS
Сделать код сайта проще можно, уменьшив его объем. Для этого нужно выполнить несколько операций.
Прежде всего, следует избегать флеш-технологий, JavaScript, фреймов, текста, представленного картинкой. Все элементы, какие возможно, следует оформить в отдельных, внешних файлах (например, CSS и JS, как уже отмечалось выше). Помогут для оптимизации кода специальные плагины. К примеру, можно установить плагин Autoptimize, который автоматически оптимизирует код HTML, CSS, JS (если поставить соответствующие галочки). Необходимо настроить грамотную и удобную навигацию по сайту, которая будет понятна пользователям и корректно распознаваема поисковиками. Это увеличит скорость, качество загрузки и индексации сайта.
Что касается оптимизации CSS, то ее можно сделать самостоятельно или доверить это специальному ресурсу или программе. Ручная оптимизация – трудоемкий и длительный процесс, к тому же можно пропустить какие-то ошибки. Программа или сервис для оптимизации качественнее устранят недостатки, но могут нарушить некоторые функции, которые работали на сайте, и после проверки может некорректно отображаться контент, поэтому их работу нужно корректировать.
Некоторые способы улучшить структуру CSS в ручном режиме:
- Удалить лишние пробелы и разрывы строк, которые перегружают файл CSS и затрудняют работу роботов;
- Прописывать обобщающие свойства вместо несколько раз повторяющихся похожих команд;
- Использовать лаконичные, понятные описания в комментариях;
- Необычные шрифты прописывать при помощи стилей, а не изображений;
- Для картинок создавать alt и title (разные для каждого изображения), чтобы их содержание распознавалось ботами поисковых систем;
- Применять к заголовкам инструменты H1 – и далее, чтобы они корректно распознавались при индексации;
- Прописывать в keywords только те ключевые слова, которые используются на странице, минимизировать их количество;
- Использовать разнообразные и краткие мета-теги.
CSS и HTML оптимизаторы
Удобно и быстро осуществить оптимизацию непосредственно в браузере можно при помощи специальных сервисов, например:
- CleanCSS.com;
- CSS Optimizer;
- CSS Compressor;
- CY-PR.com;
- плагин Autoptimize.
Специалисты в SЕО и IT советуют пользоваться CleanCSS.com, так как он позволяет выбрать степень сжатия от низкой до высочайшей или подобрать индивидуальные настройки. После высокого и высочайшего уровней оптимизации код сайта принимает практически нечитаемый вид, и вносить в него изменения будет практически невозможно. Поэтому для начала следует воспользоваться стандартной оптимизацией. Можно выбрать режимы сжатия конкретного контента или оптимизацию отдельных параметров: сжатие шрифтов, изображений, удаление пробелов.
Также программа позволит сохранить результат в файле, в том числе в виде текста с отчетом о произведенных изменениях, подсветкой синтаксиса.
На ресурсе CY-PR.com также есть похожий инструмент для оптимизации, который облегчает структуру CSS на 25-30%, но здесь нет возможности сформировать файл с кодом после выполнения операции.
Остальные сервисы достаточно радикально могут поменять код так, что некоторые функции на сайте перестанут работать. Поэтому с их помощью лучше производить только локальные изменения в конкретных параметрах сайта.
После оптимизации следует проверить работоспособность сайта, корректное отображение дизайна, скорость загрузки. Нормальной считается ситуация, когда страницы и пользовательские опции сайта загружаются не более 3-5 секунд.
Для того чтобы проверить степень оптимизации и понять, насколько эффективно теперь прописан HTML-код, можно воспользоваться такими сервисами, как:
- optimization.com;
- Портал seo-чеклист;
- плагин Firebug.
Эти инструменты помогут проверить, все ли сделано для уменьшения объема HTML-кода и улучшения его структуры. На ресурсе SEO-чеклист можно проверять по списку, что уже было сделано для оптимизации, а что – еще нет, и устанавливать пометку на совершенных делах.
Валидация
Проверить код сайта на наличие ошибок можно при помощи сервисов проверки валидации – валидаторов. Эффективная проверка кода осуществляется с помощью validator.w3c.org
Если система при первой проверке выдаст более полутысячи ошибок, не стоит расстраиваться. После исправления определенного недочета, можно запускать проверку снова и ошибок станет намного меньше, так как один недостаток влечет за собой другие и при его исправлении они исчезнут.
Сайт с исправленным и оптимизированным кодом имеет больше шансов на высокие позиции в выдаче, чем ресурс с перегруженным HTML-кодом, в котором присутствуют ошибки.
znet.ru
Зачем это нужно?
Ответ прост. Оптимизация кода не только ускорит загрузку страниц, но и сделает сайт более дружелюбным к поисковым системам — код станет чистым и красивым, а его элементы будут располагаться в нужных местах. Кроме того, изначально скептически воспринятое оптимизаторами в ноябре 2009 заявление Google о том, что скорость загрузки web-документа является одним из факторов ранжирования, только подтверждает тот факт, что оптимизацией кода страниц следует заниматься. Тем более, что на этот фактор оптимизатор может влиять сам.
Составляющие оптимизации кода
Ни для кого не секрет, что поисковые роботы не видят дизайн страницы — они читают её код, причем делают это также как и человек — сверху-вниз, слева-направо. Информации, находящейся вверху кода тех или иных элементов, поисковые системы дают больший приоритет. Таким образом, при SEO-вёрстке наиболее важные элементы или страницы следует располагать выше второстепенных элементов. Ниже даны некоторые рекомендации для оптимизации кода страниц, которые позволят сделать кампанию по его продвижению в поисковых системах более эффективной.
1. Title, Description и Keywords — располагаем сразу после тега <head>.
Данные должны следовать сразу после тега
. Очень часто этим пренебрегают, и нередко можно видеть, как после заголовка head идёт всё, что угодно, но только не Title и мета-теги. Многие популярные CMS, например, Joomla «грешат» этим.
В приведенном выше примере, если не обращать внимание на спамный keywords, показана часть неоптимизированного поля HEAD.
2. CSS-стили и Java-скрипты — «прячем» в файлы .css и .js.
Если пренебрегать этим простым правилом, то значительную часть кода страницы могут составлять стили оформления элементов страницы и java-скрипты. Этот код является техническим, он не несёт пользователю полезной информации, т.к. в нем не сосредоточен контент, но при этом он добавляет объём для страницы. Поэтому очевидно, что для ускорения загрузки страниц и SEO-вёрстки необходимо выносить его в отдельные файлы с расширениями .css и .js.
3. Контент в коде — «выше»!
Среди вебмастеров ходит много споров на тему того, какая верстка лучше для поисковых систем — табличная или верстка слоями (div’ная). С точки зрения индексации документов отличий никаких нет, однако, табличная верстка не всегда позволяет вывести нужную часть контента вверху кода страницы в отличие от div’ной, где при грамотном с точки зрения SEO-верстки позиционировании блоков можно добиться такого эффекта, что код, содержащий нужный оптимизированный контент, будет расположен вверху. При этом визуально на странице этот блок может располагаться где угодно — как под шапкой, так и в футере сайта. Таким образом, без ущерба дизайну страницы можно добиться дружелюбности к поисковым системам.
4. Ненужный и сомнительный код — закрываем от индексации.
Элементы страниц, не несущие в себе смысловой нагрузки, нужно закрывать от индексации. Таким образом, повышается общая релевантность документа. Яндекс читает код, заключенный в парный тег
Нередко можно встретить случаи, когда на сайте используется выпадающее CSS-меню. В этих случаях, как правило, также необходимо закрыть его от индексации, поскольку оно не только будет занимать значительную часть кода, но и дублироваться на всём сайте.
5. Закомментированный код удаляем.
Просматривая исходные коды интернет-страниц, довольно часто можно увидеть закомментированные элементы. Причем иногда суммарная доля такого кода занимает более 50%. Закомментированный код может серьезно увеличить объём html-страницы, тем самым, увеличив время загрузки документа. Такой код может появляться, например, в случае, когда происходит редизайн или переверстка сайта. Верстальщик может закомментировать килобайты кода и не удалить его по окончанию работ.
6. «Скрытые» элементы. Снижение риска наложения санкций.
Если в коде страниц сайта присутствуют скрытые от поисковых систем средствами CSS-форматирования элементы, от них также необходимо избавиться. К наиболее часто встречающимся элементам этой категории относятся «display:none» и «visibility:hidden». Если проект полностью белый и Вам нечего скрывать от пользователей, не стоит рисковать и ждать возможных санкций от Яндекса.
7. Валидность & кроссбраузерность — Яндекс рекомендует.
В своих Яндекс отмечает, что код должен быть валидным и соответствовать стандартам W3C. Валидный код гарантированно будет совместим со всеми версиями всех и обрабатывается лучше, чем код, написанный не по спецификации. Проверить сайт на валидность кода можно на сайте .
На поведенческие факторы существенное влияние может оказать некроссбраузерная верстка. Сайт должен одинаково хорошо отображаться во всех современных браузерах при разных разрешениях. Довольно часто можно увидеть, когда браузер Internet Explorer некорректно отображает содержимое сайта, причем отличия с Firefox и Opera кардинальные. Если на таком сайте процент пользователей IE составит 20%, то вероятность того, что показатель отказов значительно увеличится, возрастает. Пользователь не проведет много времени на таком сайте, вероятно, сразу же закроет вкладку и никогда не вернется на сайт повторно. Верстку сайта следует поручать профессионалам, для которых понятия «валидность» и «кроссбраузерность» — не пустые звуки.
8. Оптимизация картинок под web.
Этот пункт относится больше к юзабилити, но не сказать о нем нельзя. Некоторые вебмастера не уделяют оптимизации картинок под web должного внимания. Тем не менее, каждый пользователь интернета хоть раз попадал на сайт, где текстовый контент загружался быстро, а графические изображения открывались с огромным трудом.
Выяснялось, что дело не в не самой быстрой скорости подключения к интернету, а в том, что кажущиеся мини-картинки на самом деле имеют огромные разрешения, но вместо того, чтобы сжать изображение в графическом редакторе, верстальщик в коде страницы прописал атрибутам картинок «width» и «height» значения, в 15 раз, меньшие, чем реальное разрешение фотографий. Иногда доходит до того, что в веб-документе используют изображения в формате .bmp, как известно, имеющие гораздо большие объёмы в сравнении с идентичными изображениями в форматах .jpg или .gif. В качестве примера можно привести страницу о популярном сейчас биатлоне — . Чтобы посмотреть в подгружаемом все фотографии, пользователь вынужден будет скачать порядка 20 Мб трафика, поскольку 90% изображений там выполнено в bmp-формате.
Как быть и что делать в нынешних условиях?
В большинстве случаев, на практике выходит так, что клиент заказывал создание сайта в одной веб-студии или у фрилансеров (к сожалению, данные категории не всегда имеют правильное и современное представление о SEO-верстке), а продвигать решил в одной из SEO-компаний, которые, как правило, такие проблемы не решают и продвигают то, что есть своими «конвейерными» методами. В успешной SEO-кампании в Яндексе в нынешних реалиях мелочей не бывает. Поэтому специалисты, оказывающие профессиональные услуги продвижения сайтов по высококонкурентным запросам обязательно должны иметь в своём арсенале отдел программистов и верстальщиков, а также оказывать и услуги по созданию сайтов. Заказчикам, в свою очередь, желательно ориентироваться на подрядчиков, успешно занимающихся и созданием, и продвижением сайтов одновременно или, как минимум, имеющих хорошую техническую поддержку.
Стоит отметить, что оптимизация кода страниц не гарантирует повышения позиций по ключевым запросам, но не уделять этому внимания в условиях MatrixNet и поведенческих факторов нельзя, а работать над этим нужно уже сейчас.
www.seonews.ru
На бивики появилась хорошая статья об оптимизации кода: http://community.bistudio.com/wiki/Code_Optimisation. Спасибо ShakI за (регулярную уже) наводку Автор статьи Rommel. Примерный перевод (местами пересказ).
Для начала просто сделайте это
» class=»alignleft» />Править
Не нужно стремиться к тому, чтобы скрипт работал со скоростью света, если он еще даже не выполняет всех возложенных на него задач. В первую очередь сосредоточьтесь на получении готового рабочего продукта.
Сделайте это быстрым
» class=»alignleft» />Править
Оптимизация — наше все, когда у нас работает множество процессов (запущенных экземпляров скрипта), с небольшими задержками. Однако надо иметь ввиду, что существует такое понятие как преждевременная оптимизация.
Оптимизация должна проводиться с осторожностью. Тони Хоар впервые произнёс, а Дональд Кнут впоследствии часто повторял известное высказывание: «Преждевременная оптимизация — это корень всех бед». Очень важно иметь для начала озвученный алгоритм и работающий прототип.
(Цитата, приведенная Роммелем, как минимум, расчитана на людей знакомых с C++, поэтому я привел другую, более общую цитату с википедии: «http://ru.wikipedia.org/wiki/Оптимизация_(информатика)»)
Сделайте это красивым
» class=»alignleft» />Править
Документация, читабельность, и тому подобные вещи. Чистый код — хороший код.
Что-то написано дважды? Это должно быть преобразовано в функцию!
» class=»alignleft» />Править
Предварительно откомпилированный код может здорово ускорить работу скриптов, даже с учетом небольшого замедления инициализирующего кода. Возможно, какой-то код выполняется многократно, или, что еще важнее, в вашем цикле есть что-то вроде:
call compile preprocessFileLineNumbers "script.sqf"
или:
execVM "script.sqf" // помним, что execVM производит загрузку+препроцессинг // (аналогично preprocessFileLineNumbers) + трансляцию текста в код (аналогично compile)
Если это так, то вам стоит серьезно подумать насчет того, чтобы преобразовать такой код в функцию, локальную:
_function = compile preprocessFileLineNumbers "script.sqf"
или глобальную:
globFunction = compile preprocessFileLineNumbers "script.sqf"
Добавление элементов к массиву
» class=»alignleft» />Править
Команда set в 56 раз быстрее чем двухместный оператор сложения (+), например:
_a set [count _a,_v] // работает в 56 раз быстрее чем: _a = _a + [_v]
Получение позиции
» class=»alignleft» />Править
Команды getPosASL/getPosATL примерно в 1.67 раз быстрее чем обычный getPos.
Создание вехиклов с помощью CreateVehicle
» class=»alignleft» />Править
http://community.bistudio.com/wiki/createVehicle Функция createVehicle в старом варианте не понимает 3D позиций, и в 500 раз медленнее чем ее младшая сестра: http://community.bistudio.com/wiki/createVehicle_array Ну…, как говаривает комбат, за оптимизацию!
Циклы
» class=»alignleft» />Править
for "_y" from 0 to (count [0,0,0,0] - 1) step 1 do { ... }; { ... } foreach [0,0,0,0];
Эти два типа цикла примерно одинаковы по скорости (+/- 10%), и более чем в два раза быстрее следующих циклов:
_y=0; while {_y = _y + 1; _y < count [0,0,0,0]} do { ... }; for [{_y=0},{_y<(count [0,0,0,0])},{_y=_y+1}] do { ... }
Эти типы циклов гораздо медленнее, и там где нужна максимальная производительность их следует избегать.
Избегайте сложности O(n^2)
» class=»alignleft» />Править
Если вы используете вложенные циклы, вам нужно помнить, что вы имеете дело с геометрической прогрессией:
_array = [0,0,0]; { { ... } foreach _array; } foreach _array;
Алгоритмическая сложность этого примера N^2 (3^2 = 9 итераций). Соответственно если массив содержит 1000 элементов, то такой подход обойдется в 1000000 итераций.
Как избежать задержки в 0.3ms
» class=»alignleft» />Править
Часто вам необходимо избежать задержки в 0,3 мс между выполнением ваших команд. Вот некоторые трюки которые позволяют сделать это:
1) Сработка триггеров происходит внутри того, что мы называем «монопольным» окружением (‘non-scheduled’ environment) 2) Весь инициализирующий код выполняется на одном такте игры (в оригинале «without scheduling»). 3) Условия FSM выполняются на одном такте игры (в оригинале «without scheduling»). 4) Обработчики событий, как обычные так и гуиные, выполняются на одном такте игры.
Лимит в 10 000 итераций на цикл
» class=»alignleft» />Править
Лимит в 10 000 итераций существует только для кода, выполняющемся на одном такте игры (см. выше). Циклы в execVM и spawn могут выполнятся бесконечно.
Вычисление длины вектора (magnitude)
» class=»alignleft» />Править
Или, что тоже самое, получение скалярной скорости (speed) из векторной (velocity). Конечно мы можем использовать теорему Пифагора, но команда distance работает гораздо быстрее:
_vector distance [0,0,0]
Работает также и для 2D векторов.
Комментарии
» class=»alignleft» />Править
Немного пояснений относительно ‘non-scheduled’ environment
Scheduling, здесь, можно перевести как распределение машинного времени. Например scheduling algorithm — это метод планирования, который позволяет наиболее эффективно использовать вычислительный ресурс несколькими нитями (процессами, потоками вычисления) одновременно. Применительно к скриптам в арма, это означает, что одновременно с одним скриптом могут выполнятся другие скрипты, и сама игра. Фактически, на каждом игровом тике выполняется несколько команд каждого скрипта. Или, если точнее, каждой VM (виртуальной машине в которой выполняется скрипт) дается управление на некоторое время, и как следует из текста Rommelя, между выполнением каждой команды проходит 0.3ms.
Однако, это не всегда может быть приемлемо, например когда я вывожу в листбокс несколько сотен пунктов, мне надо чтобы они появились мгновенно, а не отрисовывались один за другим на глазах у игрока (а именно так и происходит, если делать это из кода, который вызван с помощью execVM).
Также, перед открытием диалога, может понадобится выполнить код с большими циклами, например обойти весь раздел конфига с оружием, боеприпасами, юнитами. Это тоже будет видно на глаз — диалог откроется не мгновенно, хотя чистое время которое уйдет на выполнение кода ничтожно. Тем более раздражающей эта задержка будет, если делать это прямо во время работы пользователя в GUI (обычно, когда вы обновляете листбоксы).
Если мы вызываем скрипт из обработчика события «fired», как это было принято во времена офп:
_unit addEventHandler ["fired", {exec "myScript.sqs"}]
или так:
_unit addEventHandler ["fired", {execVM "myScript.sqf"}]
то мы должны знать, что момент выстрела безнадежно профукан, а выпущенную пулю, возможно, уже не поймать, так как на само создание VM потрачено слишком много времени.
Как раз ради таких случаев и надо знать как выполнить код на одном такте игры. Вешайте обработчики так:
_unit addEventHandler ["fired", { // ваш код }]
GUI-обработчики, увы все еще, должны быть строками, но к счастью их можно разносить на несколько линий:
_guiControl ctrlAddEventHandler ["MouseButtonDown", ' // ваш код ']
так (самый быстрый вариант):
_guiControl ctrlAddEventHandler ["MouseButtonDown", ' call GlobalFunction ']
или так (самый медленный вариант):
_guiControl ctrlAddEventHandler ["MouseButtonDown", ' call compile preprocessFileLineNumbers "someFunction.sqf" ']
Один из самых неприятных моментов, заключается в том, что скрипт, передаваемый в команду addAction будет выполнен игрой with scheduling. Если мы создаем диалог, то можно использовать событие OnLoad, для его инициализации. Как выкручиваться в других случаях я пока для себя не решил
С другой стороны, возможно вы захотите выполнить бесконечный цикл или sleep, там где это невозможно, в этом случае достаточно сделать так:
0 spawn { sleep 1; // подождать waitUntil { false } // можно писать бесконечные циклы };
в строке инициализации юнита (как и в триггерах и вейпойнтах, вроде), кроме прочего, нельзя возвращать действительное значение (не nil), значит делаем так:
call { this spawn { sleep 1; // подождать _this playMove "animName"; // сыграть анимацию waitUntil { false } // можно писать бесконечные циклы } }
Естественно, в ините комментариев быть не должно
Ну вот наверное и все, что надо об этом знать.
ru.armacomref.wikia.com
Основы
Некоторые задачи часто могут быть выполнены более эффективно. Например, рассмотрим следующую программу на языке Си, которая суммирует все целые числа от 1 до N:
int i, sum = 0; for (i = 1; i <= N; i++) sum += i; printf ("sum: %dn", sum);
Этот код может быть (подразумевая, что нет переполнения) переписан, используя математическую формулу, в следующем виде:
int sum = (N * (N+1)) / 2; printf ("sum: %dn", sum);
Термин «оптимизация» обычно подразумевает, что система сохраняет ту же самую функциональность. Однако, значительное улучшение производительности часто может быть достигнуто с помощью решения насущной проблемы и удаления избыточной функциональности. Например, если обоснованно допустить, что программе не требуется поддерживать более, чем (скажем) 100 элементов при вводе, то возможно использовать статическое выделение памяти вместо медленного динамического.
Уступки (tradeoffs)
Оптимизация в основном фокусируется на одиночном или повторном времени выполнения, использовании памяти, дискового пространства, пропускной способности или некотором другом ресурсе. Это обычно требует уступок — один параметр оптимизируется за счёт других. Например, увеличение размера кэша улучшает производительность времени выполнения, но также увеличивает потребление памяти. Другие распространённые уступки включают прозрачность кода и его выразительность. Сложные специализированные алгоритмы требуют больше усилий по отладке и увеличивают вероятность ошибок.
Различные области
В исследовании операций, оптимизация — это проблема определения входных значений функции, при которых она имеет максимальное или минимальное значение. Иногда на эти значения накладываются ограничения, такая задача известна как ограниченная оптимизация.
В программировании, оптимизация обычно обозначает модификацию кода и его установок компиляции для данной архитектуры для производства более эффективного ПО.
Типичные проблемы имеют настолько большое количество возможностей, что программисты обычно могут позволить использовать только «достаточно хорошее» решение.
Узкие места
Для оптимизации требуется найти узкое место: критическую часть кода, которая является основным потребителем необходимого ресурса. Улучшение примерно 20 % кода влечёт за собой изменение 80 % результатов (см. также принцип Парето).
Архитектурный дизайн системы особенно сильно влияет на её производительность. Выбор алгоритма влияет на эффективность больше, чем любой другой элемент дизайна. Более сложные алгоритмы и структуры данные могут хорошо оперировать с большим количеством элементов, в то время как простые алгоритмы подходят для небольших объёмов данных — накладные расходы на инициализацию более сложного алгоритма могут перевесить выгоду от его использования.
Чем больше памяти использует программа, тем быстрее она обычно выполняется. Например, программа-фильтр обычно читает каждую строку, фильтрует и выводит эту строку непосредственно. Поэтому она использует память только для хранения одной строки, но её производительность обычно очень плохая. Производительность может быть значительно улучшена чтением целого файла и записью потом отфильтрованного результата, однако этот метод использует больше памяти. Кэширование результата также эффективно, однако требует большего количества памяти для использования.
См. также
- Оптимизация в Java
- Оптимизация в C++
- Абстрактная интерпретация
- Метрика хорошести
- Кэширование
- Принцип KISS
- Граф передачи управления
- Ленивые вычисления
- Низкоуровневая виртуальная машина
- Мемоизация
- Окрестность памяти
- Профилирование (анализ производительности)
- Теория очередей
- Симулятор
- Гипотетическое исполнение
- Время выполнения наихудшего случая
Ссылки
- Programming Optimization
- C,C++ optimization
- C optimization tutorial
- Software Optimization at Link-time And Run-time
- Profiling and optimizing Ruby code
- Article «A Plea for Lean Software» by Niklaus Wirth
- Description from the Portland Pattern Repository
- Улучшаем производительность приложения путем перераспределения кода (рус.)
- ПОИСК ГЛОБАЛЬНОГО ОПТИМУМА
- Оптимизация 64-битных программ (рус.)
dic.academic.ru
Оптимизация HTML
Сжатие пробелов
С помощью объединения повторяющихся пробелов и переносов строк можно уменьшить итоговый размер страницы и, соответственно, уменьшить время на итоговую загрузку страницы. Данный метод нельзя на прямую использовать для следующих тегов: <pre>, <textarea>, <script> и <style>.
Пример, часто бывает так
Но, в итоге код можно уменьшить до
Уменьшение объема контента в верхней части кода страницы
Для достижение максимальной скорости загрузки страницы в верхней части html кода нужно использовать, только тот контент (JavaScript, CSS), который необходим для загрузки первого экрана. Весь остальной код, желательно разместить в нижней части страницы. Ко всему этому, нужные блоки CSS и JavaScript можно встроить прямо в html код страницы.
Пример, такой оптимизации
Если документ HTML выглядит следующим образом:
а файл стилей small.css имеет вид
то нужный код CSS встроить можно таким образом:
В итоге файл small.css будет подгружаться после загрузки страницы.
Предварительный резолвинг DNS
С помощью данной оптимизиции вы можете сообщить браузеру по каким адресам могут находятся внешние ресурсы на данной странице (например, картинки, файлы стилей, javascript). Это позволяет сразу выполнять преобразование DNS имён.
Например, таким образом можно ускорить загрузку для систем аналитики
Удаление домена из URL в атрибутах href и src
Можно сократить код сайта путем преобразования абсолютных URL в относительные для атрибутов href и src.
Это выглядит следующим образом: до удаление домена
После удаление домена
Оптимизация CSS
Объединение всех CSS в один файл
Данное действие позволяет уменьшить необходимое количество HTTP запросов при загрузке страницы. Особенно важно
- для мобильных сетей и старых браузерах, так как максимальное кол-во подключений ограничено двумя;
- для медленного интернета, так как позволит более быстро загружать всю страницу в целом.
Пример, до
После
Минимизация CSS
Минимизация файлов стилей состоит в следующем:
- удаление всех комментариев;
- удаление пробелов;
- сокращение название цветов.
Например,
Можно сжать до
Перемещение CSS в секцию HEAD
Это позволяет сделать визуальное ускорение рендернига страница браузером. Кроме этого, для некоторых браузеров данной действие, позволяет решить проблему эффекта перерисовки элементов в случае, если сами стили прописаны после этого элемента.
Пример,
После
Перемещение файлов со стилями CSS перед JavaScript скриптами
Данное дейстивие позволит
- лучше распаралеллелить скачивание CSS и JacaScript-файлов
- увеличить скорость рендеринга страницы
Перенос небольших описаний стилей в HTML
Перенос небольших описаний стилей до 1КБ может помочь вам сократить число запросов к серверу.
Оптимизация JavaScript
Объединение всех JavaScript в один файл
Аналогично, объединению файлов CSS, данная оптимизация для JavaScript позволит уменьшить необходимое количество HTTP запросов при загрузке страницы.
Минимизация JavaScript
Минимизация JavaScript позволяет убрать лишние символы из исходного файла и специальными способами уменьшить размер кода (например, замена длинных переменных на более короткие).
Например, можно сделать с помощью этого сервиса: http://developer.yahoo.com/yui/compressor/.
Оптимизация изображений
Отложенная загрузка изображений
С помощью библиотеки Lazyload при загрузке браузера можно загружать картинки, которые находятся в видимой области. Это позволяет
- значительно сократить объемы первоначально загружаемой информации
- сократить нагрузку на сервер
Комбинирование изображений
Все изображения, которые применяются для дизайна сайта, можно объединить в одно большое, что позволит значительно уменьшить кол-во HTTP запросов при загрузке страницы.
seoprofy.ua
Копаясь в дебрях LLVM, я неожиданно обнаружил для себя: насколько всё же интересная штука — оптимизация кода. Поэтому решил поделиться с вами своими наблюдениями в виде серии обзорных статей про оптимизации в компиляторах. В этих статьях я попытаюсь «разжевать» принципы работы оптимизаций и обязательно рассмотреть примеры.
Я попытаюсь выстроить оптимизации в порядке возрастания «сложности понимания», но это исключительно субъективно.
И ещё: некоторые названия и термины не являются устоявшимися и их используют «кто-как», поэтому я буду приводить несколько вариантов, но настоятельно рекомендую использовать именно англоязычные термины.
(совсем немного теории о типах оптимизаций, которую можно пропустить)
Прежде чем мы погрузимся в великолепные идеи и алгоритмы давайте немного поскучаем над теорией: разберёмся что такое оптимизации, для чего нужны и какими они бывают или не бывают.
Для начала дадим определение (из википедии):
Оптимизация программного кода — это модификация программ, выполняемая оптимизирующим компилятором или интерпретатором с целью улучшения их характеристик, таких как производительности или компактности, — без изменения функциональности.
Последние три слова в этом определении очень важны: как бы не улучшала оптимизация характеристики программы, она обязательно должна сохранять изначальный смысл программы при любых условиях. Именно поэтому, например, в GCC существуют различные уровни оптимизации (настоятельно рекомендую сходить по этим ссылкам).
Идём дальше: оптимизации бывают машинно-независимыми (высокоуровневыми) и машинно-зависимыми (низкоуровневыми). Смысл классификации понятен из названий, в машинно-зависимых оптимизациях используются особенности конретных архитектур, в высокоуровневых оптимизация происходит на уровне структуры кода.
Оптимизации также могут классифицироваться в зависимости от области их применения на локальные (оператор, последовательность операторов, базовый блок), внутрипроцедурные, межпроцедурные, внутримодульные и глобальные (оптимизация всей программы, «оптимизация при сборке», «Link-time optimization»).
Чую, что вы сейчас уснёте, давайте закончим на этом порцию теоиии и приступим уже к рассмотрению самих оптимизаций…
(Свёртывание/Свёртка констант)
Самая простейшая, самая известная и самая распространённая оптимизация в компиляторах. Процесс «свёртки констант» включает в себя поиск выражений (или подвыражений), включающих ТОЛЬКО константы. Такие выражения вычисляются на этапе компиляции и в результирующем коде «сворачиваются» в вычисленное значение.
Рассмотрим пример (придуманный на ходу из головы, абсолютно синтетический, тривиальный, абстрактный, ничего не значащий, далёкий от реальности, etc… и все примеры будут такими):
До оптимизации | После оптимизации |
---|---|
|
|
Вроде бы получилось отлично и оптимизация выполнена, но на самом деле компиляторы поумнели и идут дальше. Дело в том, что в данном случае размер (sizeof
) структуры "p"
тоже является константой, и компиляторы об этом знают, поэтому получаем:
Разворачиваем sizeof | Завершаем свертывание |
---|---|
|
|
Олично… Несколько тактов процессора эта оптимизация нам определённо экономит.
Всё довольно просто, если наш код представлен в виде Абстрактного Синтаксического Дерева (AST). Тогда для нахождения числовых выражений и подвыражений достаточно искать узлы дерева одного уровня (то есть имеющие общего предка), содержащие только числовые значения. Тогда значение в вышестоящем узле (родительском) можно будет свернуть. Для наглядности рассмотрим на простом примере дерева для одного из выражений, возьмём наше "int a = 32*32;"
:
То есть рекурсивным обходом нашего дерева AST мы можем свернуть все подобные константные выражения. Кстати пример с числами опять же упрощён, вместо операций с числами вполне могут быть операции со строками (конкатенация) или операции со строками и числами (аналог python’овского "'-' * 10
") или константами любых других типов данных, поддерживаемых исходным языком программирования.
(Распространение констант)
Эта оптимизация обычно всегда описывается в комплекте с «Constant folding» (ведь они взаимодополняют друг друга), но это всё же отдельная оптимизация. Процесс «распространения констант» включает в поиск выражений, которые будут постоянными при любом возможном пути выполнения (до использования данного выражения) и их замену на эти значения. На деле всё проще, чем звучит — возьмём всё тот же пример, который мы уже использовали, но с учётом, что мы уже прошлись по нему оптимизацией «Constant folding»:
До оптимизации | После оптимизации |
---|---|
|
|
То есть в нашей изначальной программе вобщем-то не надо было делать никаких вычислений. А что произошло? Всё просто… Так как значения переменных "a"
и "b"
никак не могут измениться между их объявлением и использованием в вычислении значения "c"
, то компилятор сам может подставить их значения в выражение и вычислить его.
То есть компилятору необходимо для каждого выражения проверять, всегда ли его значение будет постоянным (а точнее — может ли оно измениться). Попробуем изобразить схематично:
Допустим, что компилятор при очередном проходе оптимизации обнаруживает использование переменных "a"
и "b"
. Как видно из схемы, после объявления переменной "a"
в блоке A и переменной "b"
в блоке B, ни одна, ни другая переменная не могут изменить значение в последующих блоках (A,B,C) перед их использованием. Этот случай тривиален, так как вся программа линейна и представляет из себя так называемый Базовый блок (BB). Но алгоритм определения «изменяемости» переменной в базовом блоке это ещё далеко не всё. Программа может включать условные конструкции, циклы, безусловные переходы и т.д. Тогда для определения «изменяемости» переменной необходимо построить направленный граф с базовыми блоками в вершинах, рёбра — передача управления между базовыми блоками. Такой граф называется Графом потока управления (CFG) и применяется для осуществления многих оптимизаций. В таком графе можно определить все базовые блоки, которые необходимо пройти от инициализации переменной до её использования и определить для каждого блока, может ли в нём измениться значение переменной. В случае невозможности его изменения, компилятор легко может заменить её значение константой.
«Constant propagation» и «Constant folding» обычно прогоняются несколько раз, пока не перестанут вносить какие-либо изменения в код программы.
(Распространение копий)
А это ещё один спутник двух предыдущих оптимизаций, практически брат-близнец «Constant Folding», выполняющий очень похожую работу, но позволяет избавится от лишних (промежуточных) присваиваний переменных, подменяя в выражениях промежуточные переменные. Гораздо нагляднее это будет на простейшем примере:
До оптимизации | После оптимизации |
---|---|
|
|
(Устранение/Исключение недоступного кода)
Очень простая, но, к сожаленью, мало чего улучшающая в плане производительности оптмизация. Всё просто: код, который никак не может быть использован в программе, можно удалить. Давайте посмотрим пару примеров «мёртвого груза кода»:
До оптимизации | После оптимизации |
---|---|
|
|
Как видите, строка "printf("Hi, I'm dead code =( !");
" является недостижимой при любых обстоятельствах: либо программа выполняется бесконечно, либо завершается «насильно». Давайте ещё пару примеров:
До оптимизации | После оптимизации |
---|---|
|
|
Думаю здесь тоже всё ясно без комментариев: строка "printf("x = %d n", &x);
" также, как и в предыдущем примере, недостижима при любом пути исполнения программы, а объявленная в первой строки функции main переменная y никак не используется.
Ну и последний пример для этой оптимизации:
До оптимизации | После оптимизации |
---|---|
|
|
И опять всё просто: функция sub не вызывается ни в одном месте программы, поэтому от неё можно избавиться.
С одной стороны «мёртвый код» в программе очень легко находится с помощью графа потока управления. Если в программе есть мертвый код, то граф будет либо несвязным и можно «выбросить» отдельные фрагменты графа. С другой стороны необходимо учитывать адресную арифметику и множество других ньюансов — не всегда можно однозначно определить, является ли код «мёртвым».
(Устранение общих подвыражений)
Очень полезная и «красивая» оптимизация. Заключается в следующем: если вы используете расчёт какого либо выражения два или более раз, то его можно рассчитать один раз, а затем подставить во все использующие его выражения. Ну и куда мы без примера:
До оптимизации | После оптимизации |
---|---|
|
|
Да, этот оптимизированный код выглядит гораздо страшнее и более громоздко, но он избавлен от «лишних вычислений» (однократно сложение и вычитание x и y вместо трёхкратных, однократное перемножение a и b вместно двухкратного). А теперь представьте сколько эта оптимизация экономит процессорного времени в рамках большой вычислительной программы.
P.S. На самом деле я хотел приводить схемки для каждой из оптимизаций, но извиняйте, меня хватило на рисование всего двух.
P.P.S. Подскажите УДОБНЫЙ сервис для рисования схемок и графов.
P.P.P.S. To be continued?
habr.com