<rmcreative>

RSS

Все заметки с тегом «Optimization»

Можно уточнить:

    (11)
    (1)
  1. (2)
    (1)
  1. (2)
    (2)
    (1)
  1. (1)
    (1)
    (12)
  1. (2)
    (1)
  1. (1)
    (1)
  1. (6)
  2. (2)
  3. (1)
    (1)
    (1)
  1. (2)
    (6)
  1. Оптимизация ORDER BY RAND()

    10 января 2011

    Задача «выбрать 10 случайных постов» часто решается так:

    SELECT *
    FROM post
    ORDER BY RAND()
    LIMIT 10;

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

    EXPLAIN показывает нам Using temporary; Using filesort, что означает создание временной таблицы (а для большого количества записей она ещё и на диск пишется) и не использование индекса. Виновник, как вы уже догадались — ORDER BY RAND().

    Чтобы использовать индекс можно выбрать не все данные, а только id:

    SELECT id
    FROM post
    ORDER BY RAND()
    LIMIT 10

    Теперь имея 10 id получим посты:

    SELECT post.*
    FROM (
        SELECT id
        FROM post
        ORDER BY RAND()
        LIMIT 10
    )  
    AS ids JOIN post ON post.id = ids.id

    Получаем результат примерно за 10мс, что несомненно лучше. Но и этого может не хватить.

    В этом случае можно поступить следующим образом:

    • По крону получить 10—20 вариантов случайных записей.
    • Записать в отдельную таблицу, предварительно очистив её.

    Далее делаем rand(1, 20) на сервере и выполняем очень простой и быстрый запрос:

    SELECT *
    FROM random_post
    WHERE random_id = :random_id

    Если нужно ещё быстрее — делаем аналог на Redis или memcached.

    14 комментариев
  2. Текстовые значки

    27 октября 2010

    В большинстве модальных окошек, админок и других мест используются значки-картинки. Значки — это, конечно, хорошо, но также часто они дублируют символы.

    Например, значок закрытия окна или удаления чего-либо отлично заменяется символом ×.

    Да и вообще набор символов в UTF поразительный:

    • Рейтинг: ★★★☆☆
    • Избранное:
    • Ахтунг:
    23 комментария
  3. Как тестировать и оптимизировать JS скрипты

    12 июля 2010

    Павел Марковнин подробно рассказывает, как пользоваться профайлером Firebug на живом примере.

    Рекомендую

    Комментировать
  4. Steve Souders об особенностях клиентской оптимизации

    15 февраля 2010

    Steve Souders поделился сразу несколькими занятными фактами об особенностях современных и не очень браузеров.

    IE и независимые от протокола URI

    Internet Explorer 7 и 8 при использовании URI вида "//rmcreative.ru/css/main.css" будут загружать файл два раза. При явном указании http, https или использовании относительных URI этого не происходит.

    document.write и FireFox

    При загрузке скриптов через document.write в FF (в том числе и в 3.6) блокируются остальные загрузки.

    IE грузит стили с media="print"

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

    Подключаем стили через JavaScript

    Можно избежать блокировки, используя JavaScript:

    var link = document.createElement('link');
    link.rel = 'stylesheet';
    link.type = 'text/css';
    link.href = '/main.css';
    document.getElementsByTagName('head')[0].appendChild(link);

    Chrome, Safari и загрузка фоновых изображений

    Перечисленные браузеры начинают загружать фоновые изображения до подгрузки CSS. Таким образом, изображения будут загружены даже если в CSS они переопределены.

    Источники:

    4 комментария
  5. HipHop

    3 февраля 2010

    Facebook, как вы уже могли слышать, выпустил транслятор PHP в код C++, названный HipHop.

    Отмечу основные моменты

    • Бесплатный, открытый исходный код.

    • HipHop уже используется в Facebook по полной программе.

    • PHP → С++ → GCC → бинарник. Делать это надо каждый раз при развёртывании кода.

    • Бинарник может работать как сервер (libevent), а также запускаться из командной строки.

    • Веб сервер = один процесс, много потоков.

    • Не использует Zend Engine. Использует написанный на C++ почти совместимый с PHP 5.2 фреймворк.

    • Используются расширения на C++ (стандартные написаны C). Сейчас доступны те, что использует Facebook. Остальные будьте готовы переписывать сами. Все расширения на C++ thread-safe.

    • Некоторые магические методы поддерживаются, но не работают быстрее.

    Не поддерживаются

    • Windows.

    • PHP 5.3 (поддержка планируется).

    • eval().

    • create_function()

    • preg_replace с модификатором /e.

    • function_exists() до объявления функции.

    Поддерживаемый динамический функционал

    • Динамический вызов функций, в том числе call_user_func().

    • Динамические методы и свойства объектов.

    • Динамические переменные, extract().

    • Динамический include().

    • Переопределение функций, классов, констант.

    • __toString(), __get(), __set(), __call().

    Источники информации:

    10 комментариев
  6. Книга «Реактивные веб-сайты»

    22 января 2010

    http://speedupyourwebsite.ru/i/reactivewebsites/cover.small.jpg

    Вышла финальная электронная версия второй книги по клиентской оптимизации за авторством Николая Мациевского (webo.in, «Разгони свой сайт», Web Optimizer), Евгения Степанищева и Глеба Кондратенко.

    Читаем

    Появление книги в магазинах в традиционном бумажном виде запланировано на Март.

    3 комментария
  7. Асинхронный API Google Analytics

    3 декабря 2009

    Наконец-то Google Analytics можно установить у себя без ущерба скорости загрузки страницы.

    Новый код выглядит так:

    var _gaq = _gaq || [];
      _gaq.push(['_setAccount', 'UA-XXXXX-X']);
      _gaq.push(['_trackPageview']);
     
      (function() {
        var ga = document.createElement('script');
        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 
            'http://www') + '.google-analytics.com/ga.js';
        ga.setAttribute('async', 'true');
        document.documentElement.firstChild.appendChild(ga);
      })();

    Официальный анонс

    Документация

    Рецензия-отзыв Steve Souders

    2 комментария
  8. cssmin.js

    24 сентября 2009

    Один из моих любимых технических писателей Stoyan Stefanov, автор Object-Oriented JavaScript, портировал обжиматель CSS из YUICompressor на JavaScript.

    Демо

    Код

    Кстати, за основу сжатия CSS в YUICompressor был взят cssmin, написанный на PHP.

    3 комментария
  9. «Реактивные веб-сайты». Первая версия рукописи

    14 сентября 2009

    http://speedupyourwebsite.ru/i/reactivewebsites/cover.small.png

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

    Анонс на хабре от автора

    Почитать в электронном виде

    Комментировать
  10. Сергей Чикуёнок ответил на вопросы

    1 сентября 2009

    В рамках онлайн-конференции Сергей Чикуёнок ответил на множество различных вопросов.

    Вопросы и особенно ответы получились на удивление полезными, так что советую прочитать и обдумать.

    Читаем

    Кстати, в рамках той же онлайн-конференции задавались вопросы и другим не менее интересным людям.

    Комментировать