
Конкатенация строк — два способа.
Конкатенацию строк, а точнее добавление одной строки в конец другой можно использовать двумя способами.
1. $a = $a. $b;
2. $a .= $b;
Опытные программисты вряд ли используют первый вариант, а вот новички вполне могут.
Я на своем горьком опыте убедился, что первый вариант выполнятеся в сотни раз дольше.
Чтобы это себя проявило, строка $b должна быть не менее 40 символов. Количество итераций — порядка 10000.
Причем при изучении этого вопроса выяснилось, что синтаксическое усложнение либо увеличение длины присоединяемой строки сильно влияет на скорость в первом случае, и гораздо меньше во втором.
Комментарий пользователя gribozavr:
Вот кусок кода, которые каждый может проверить у себя сам:
UPD: По просьбе трудящихся переношу сюда из личного блога.
UPD: В комментариях в другой ветке один товарищ (f33l) написал, что это все-таки баг и дал ссылку:
bugs.php.net/bug.php? id=44069
Исправлен баг как раз в версии 5.2.6. Хотя у меня на хостинге тоже 5.2.6, но «проблема» наблюдается.
В баге говорится об утечке памяти, но судя по комментарию в обсуждении к топику, на время выполнения это тоже повлияло.
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, но «проблема» наблюдается.
В баге говорится об утечке памяти, но судя по комментарию в обсуждении к топику, на время выполнения это тоже повлияло.
Comments 72
Only users with full accounts can post comments. Log in, please.