ДОСТИГНУТО:

01.11.2016-300 страниц в индексе Google;
19.01.2017-300 страниц в индексе Яндекса;
03.02.2017-40 ТИЦ;
05.02.2017- сайт принят в DMOZ каталог;

PHP работа со строками, скорость и расход памяти при конкатенации

.

pishpPHP работа со строками, скорость и расход памяти при конкатенации

Всем привет!

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

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

У каждого веб-мастера, как начинающего, так и продвинутого, есть свой стиль и предпочтения в написании кода PHP скриптов, но тем не менее практически все знают три популярные синтаксические конструкции для склеивания строки текста из нескольких частей:

Давайте протестируем, с какой же из приведенных выше синтаксических конструкций при выполнении PHP-скрипт покажет наилучшую производительность и сколько при этом он будет расходовать оперативной памяти.

Для тестов подготовлены скрипты, в каждом из которых будет использоваться конкретная синтаксическая конструкция конкатенации (склеивания) строк. Начальная строка, переменная $a, изначальна нулевая, но в цикле, состоящем из 10000 шагов ($steps = 10000;) к строке $a будут добавляться части текста «01234567890123456789″, являющегося значениями переменных $b, $c и $d.

Работа тестовых скриптов проверена на четырех версиях PHP 5.2.17, 5.3.26, 5.4.16 и 5.5.0. Результат, как может показаться странным для некоторых, практически одинаков при выполнении конкретного теста на всех версиях PHP, хотя вроде бы еще для версии PHP 5.2.x был зарегистрирован баг, касающийся алгоритма работы движка со строками, но его так похоже и не исправили даже в самой последней версии PHP 5.5.0.

Первый тест

Начнем с проверки работы (скорости и расхода памяти) самой, как мне кажется, популярной конструкции для конкатенации (склеивании) строк типа
$a = $a . $b . $c . $d;

Результат выполнения скрипта:

Как Вы видите, время, затраченное на выполнение цикла из 10000 шагов, превышает 2 секунды и пиковый расход памяти равен 2,621,440 байт. Результат практически одинаков для всех версий PHP 5.2.x — 5.5.0

Второй тест

Теперь проверим скорость работы и расходуемую память другой конструкцией для конкатенации строк, где в строку вставляются значения переменных:
$a = $a . "$b $c $d";

Заметьте, что часть кода для формирования строки заключена именно в двойные кавычки, а не в одиночные. При использовании одиночных кавычек у нас бы просто к строке добавлялся текст из 8 символов ‘$b $c $d’, а нам нужно, чтобы добавлялись конкретные текстовые значения переменных $b, $c и $d.

Результаты работы скрипта теперь существенно отличаются — время выполнения уменьшилось почти в три раза, да и расход памяти также уменьшился:

Это были результаты для версии PHP 5.4.16, а вот для PHP 5.5.0 все выглядит уже более радужно — скорость работы увеличилась на порядки, и дополнительно уменьшился расход памяти:

Третий тест

Напоследок проверяем производительность работы и расход памяти при использовании конструкции для конкатенации строк типа
$a .= $b;
$a .= $c;
$a .= $d;

где мы также дополняем строку в переменной $a подстроками из значений переменных $b, $c и $d:

В результате мы получаем абсолютно одинаковую, причем самую наилучшую производительность (скорость работы) скрипта для всех проверяемых нами версий PHP 5.2.17, 5.3.26, 5.4.16 и 5.5.0.

Заключение

Для большей наглядности и сравнения привожу в пример все результаты тестов (за исключением второго теста, выполненного под PHP 5.5.0):

По результатам тестов видно, что самая высокая скорость работы (производительность) скрипта для конкатенации (склеивании) строк достигается конструкцией вида:
<strong>$a .= $b;</strong>
<strong> $a .= $c;</strong>
<strong> $a .= $d;</strong>

Причем эта синтаксическая конструкция одинаково хороша для всех популярных и новых версий PHP от 5.2.17 до 5.5.0. Конечно, такая конструкция для конкатенации строк занимает по нескольку строк кода, но ведь она дает именно положительный результат. Да и как мне кажется, такой вид записи кода наиболее понятен и легко читаем.

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

Удачных Вам решений!

БЕРЕГИТЕ СЕБЯ!




лайк

Эти красотки хотят чтобы ты их жестко лайкнул и даже несколько раз твитнул!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *