Pull to refresh

Comments 13

Ну… по сути то же самое что и конкатенация строк в том же С (c-style строки) по трудоемкости
3 раза прочёл, но твою мысль так и не понял :)
Если грубо — имеется ввиду, что вызов одного метода array_merge на 1000 массивов выгоднее по времени, чем циклические 1000 вызовов array_merge на одном массиве.
Это понятно из кода в заметки. Для меня осталась загадкой аналогия с конкатенацией c-style строк.

Соль статьи не склеивание, а вызов функции с большим количеством параметров. Склеивание — это скорей побочный эффект, потому что была выбрана функция array_merge.
Я имел в виду, что либо мы вот так бы в цикле выделяли место под новую строку, размером в сумму 2х, копировали в нее первую, конкатенировали 2ю. Либо набирали бы все строки для склеивания в массив строк, а потом бы выделяли 1 большую строку для конкатенации всех этих строк. Во втором случае отсутствует шаг «копировали в нее первую», за счет чего должно повыситься быстродействие. Собственно, в этом и аналогия.

p.s. Вариант с одной большой строкой «про запас, чтобы хватило на все случаи жизни» не рассматриваем ;)
Если требуется именно скорость, то можно пожертвовать компактностью, и будет еще быстрее:
for ($i = 0; $i < 1000; $i++) {
foreach(array(1, 2, 3) as $v) {
$array1[] = $v;
}
}
В 2 раза быстрее.
Опа, как забавно. Завтра опробую на своих реальных данных и отпишусь (кто его знает, как оно себя поведет на разном кол-ве итераций и разных размерах склеиваемых массивов).
Да, было бы интересно узнать как будет с разными массивами.
Если данных в присоединяемых массивах много, то лучше вместо foreach использовать while (или for) — памяти жрать меньше будет на время выполнения цикла.
На реальных данных вложенный цикл тоже оказался быстрее, но всего на 5-10%, не более.
Еще фишка… Мож у меня как-то php криво встал, может быть еще что (сам скрипт вроде правильно написан)…
Если запускать ваш скрипт полностью, то второй случай (с call_user_func_array) выдает где-то 8-10 мкс, а если закомментить строки 1-6, то уже получается 20-25 мкс…
Как-то странно что первый цикл влияет на время выполнения второго…
Выделение памяти?
Не заметил у себя такого эффекта
Sign up to leave a comment.

Articles