Ярлыки

пятница, 1 апреля 2011 г.

PHP Оптимизация кода

  • Если метод может быть статическим, сделайте его статическим.
  • echo быстрее, чем print.
  • Передавайте в echo несколько параметров, вместо использования конкатенацию строк.
  • Устанавливайте максимальное количество повторений ваших циклов for до цикла, а не во время его выполнения.
  • Удаляйте свои переменные для освобождения памяти, особенно если это большие массивы.
  • Остерегайтесь волшебных методов, таких как __set, __get, __autoload.
  • require_once дорого обходится.
  • Указывайте полные пути в командах include/require, поиск файла будет идти быстрее.
  • Если вам необходимо определить время, когда скрипт был запущен, лучше используйте $_SERVER[’REQUEST_TIME’] вместо time().
  • Старайтесь применять strncasecmp, strpbrk и stripos вместо регулярных выражений.
  • str_replace быстрее, чем preg_replace, но strtr быстрее, чем str_replace.
  • Если функции замены строк, может принимать в качестве аргументов как массивы, так и одиночные символы, и если ваш список аргументов не слишком длинный, подумайте над тем, чтобы записать несколько одинаковых выражений замены, проходя один символ за раз, вместо одной строки кода, которая принимает массив поиска и замены
  • Лучше использовать конструкции else if, чем несколько конструкций if.
  • Подавление кодов ошибок при использовании @ работает очень медленно.
  • Используйте модуль Apache mod_deflate.
  • Прерывайте свои соединения с БД, когда закончите работать с ними.
  • $row["id"] в семь раз быстрее, чем $row[id].
  • Сообщения об ошибках дорого стоят
  • Не используйте функции внутри условия цикла for, например как здесь: for ($x=0; $x < count($array); $x). Здесь функция count() будет вызываться при каждом проходе цикла.
  • Инкремент локальной переменной в методе - самый быстрый. Почти также работает инкремент локальной переменной в функции.
  • Инкремент глобальной переменной в 2 раза медленее, чем локальной.
  • Инкремент свойства объекта (т.е. $this->prop++) в 3 раза медленнее, чем локальной переменной.
  • Инкремент неопределённой переменной в 9-10 раз медленнее, чем заранее инициализированной.
  • Объявление глобальной переменной, без использования её в функции, также замедляет работу (примерно на ту же величину, что и инкремент локальной переменной). Вероятно, PHP выполняет проверку на существование этой переменной.
  • Скорость вызовов метода, не зависит от количества методов в классе. Я добавил 10 методов в тестовый класс (до и после тестового метода) и производительность не изменилась.
  • Методы в производных классах работают быстрее, чем они же, определённые в базовом классе.
  • Вызов функции с одним параметром и пустым телом функции в среднем равняется 7-8 инкрементам локальной переменной ($localvar++). Вызов похожего метода - примерно равен 15 инкрементам.
  • Ваши строки, определённые при помощи апострофа, а не двойной кавычки, будут интерпретироваться чуть быстрее, т.к. PHP ищет переменные внутри текста в двойных кавычках. Конечно, вы можете использовать это только тогда, когда в вашей строке нет переменных.
  • Строки, разделённые запятыми, выводятся быстрее, чем строки, разделённые точкой. Примечание: это работает только с функцией echo, которая может принимать несколько строк в качестве аргументов.
  • PHP-скрипты будут обрабатываться, как минимум, в 2-10 раз медленнее, чем статические HTML-страницы. Попробуйте использовать больше статических HTML-страниц и меньше скриптов.
  • Ваши PHP-скрипты компилируются каждый раз, если скрипты они не кэшируются. Кэширование обычно увеличивает производительность на 25-100% за счёт экономии времени на компиляцию.
  • Кэшируйте, насколько это возможно. Используйте memcached — это высокопроизводительная система кэширования объектов в памяти, которая повышает скорость веб-приложений за счёт уменьшения времени загрузки БД. Кэшированный микрокод полезен тем, что позволяет вашему скрипту не перекомпилироваться заново для каждого запроса.
  • При работе со строками, для определения длины строки, вы, разумеется, захотите использовать функцию strlen(). Эта функция работает очень быстро, ведь она не выполняет каких-либо вычислений, а лишь возвращает уже известную длину строки, доступную в zval-структуре (внутренняя структура C, используемая при работе с переменными в PHP). Однако потому, что strlen() — функция, она будет работать медленно за счёт вызова некоторых операций, таких как приведение строки в нижний регистр и поиска в хэш-таблице, только после которых будут выполнены основные действия функции. В некоторых случаях вы сможете ускорить свой код за счёт использования хитрости с isset(). Было: if (strlen($foo) < 5) { echo "Foo is too short"; }
    Стало: if (!isset($foo{5})) { echo "Foo is too short"; }
    Вызов isset() быстрее, чем strlen() потому, что isset() - не функция, а языковая конструкция. За счёт этого isset() не имеет практически никаких накладных расходов на определение длины строки.
  • Инкремент или декремент переменной при помощи $i++ происходит немного медленнее, чем ++$i. Это особая специфика PHP, и не нужно таким образом модифицировать свой C и Java-код думая, что он будет работать быстрее, этого не произойдёт. ++$i будет быстрее в PHP потому, что вместо четырёх команд, как в случае с $i++, вам понадобится только три. Пост-инкремент обычно используется при создании временных переменных, которые затем увеличиваются. В то время, как пре-инкремент увеличивает значение оригинальной переменной. Это один из вариантов оптимизации PHP-кода в байт-код утилитой Zend Optimizer. Тем не менее, это хорошая идея, поскольку не все байткод-оптимизаторы оптимизируют это, также остаётся немало скриптов, работающих без оптимизации.
  • Не всё должно быть написано с использованием ООП. Часто это излишне, поскольку методы и объекты занимают много памяти.
  • Не определяйте каждую структуру данных в виде класса - массивы бывают намного полезнее.
  • Не слишком разбивайте методы. Думайте, что вы действительно будете повторно использовать.
  • Вы всегда можете разбить код на методы позже, если возникнет такая необходимость.
  • Используйте сколько угодно предопределённых функций.
  • Если в вашем коде есть функции, работающие очень долго, может стоит их переписать на C в виде расширения?
  • Профилируйте свой код. Профилирование покажет вам, сколько времени выполняются части вашего кода.
  • mod_gzip — модуль Apache, который позволяет сжимать ваши данные на лету и может существенно уменьшить объем передаваемых клиенту данных.
link

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

Отправить комментарий