Pull to refresh

Конкатенация строк — два способа.

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

1. $a = $a. $b;
2. $a .= $b;

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

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

Чтобы это себя проявило, строка $b должна быть не менее 40 символов. Количество итераций — порядка 10000.

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

Комментарий пользователя gribozavr:

> Первый вариант выполнятеся в сотни раз дольше.

Естественно (говорю даже не запуская). Смотрите:

1. Происходит вычисление правой части, в результате создаётся новая строка в памяти, и $a присваивается эта строка (в результате чего предыдущее значение внутри $a выбрасывается). Итого: одно выделение памяти, одно освобождение, два копирования.

2. Происходит добавление к уже существующей строке, присваивания нет, происходит по сути просто увеличение буфера, и максимум одно копирование.


Вот кусок кода, которые каждый может проверить у себя сам:

<? php

$a = NULL;
$b = «Довольно длинная строка, символов эдак 40»;
$start = microtime(1);

for($i=0;$i<10000;$i++) {
$a = $a. $b;
}

$end = microtime(1);
$time = $end — $start;
echo $time.«
»;

$a = NULL;
$b = «Довольно длинная строка, символов эдак 40»;
$start = microtime(1);

for($i=0;$i<10000;$i++) {
$a .= $b;
}

$end = getmicrotime(1);
$time = $end — $start;
echo $time;

?>


UPD: По просьбе трудящихся переношу сюда из личного блога.

UPD: В комментариях в другой ветке один товарищ (f33l) написал, что это все-таки баг и дал ссылку:
bugs.php.net/bug.php? id=44069
Исправлен баг как раз в версии 5.2.6. Хотя у меня на хостинге тоже 5.2.6, но «проблема» наблюдается.
В баге говорится об утечке памяти, но судя по комментарию в обсуждении к топику, на время выполнения это тоже повлияло.
Tags:phpконкатенация строкbugбаг
Hubs: PHP
Total votes 78: ↑41.5 and ↓36.5 +5
Views142.2K

Comments 72

Only those users with full accounts are able to leave comments. Log in, please.

Popular right now

PHP developer
from 140,000 ₽PerAreRemote job
PHP-разработчик
from 150,000 to 190,000 ₽Laptop.ruМоскваRemote job
PHP-разработчик (Middle)
from 80,000 to 120,000 ₽Laptop.ruRemote job
PHP-разработчик
from 140,000 ₽Digital-агентство ДАЛЕЕМосква
PHP разработчик
from 120,000 to 160,000 ₽Bash TodayRemote job