это связано с фрагментацией памяти.
Рассмотрим две строки, соединенные в одну строку. Каждый оригинал должен оставаться до тех пор, пока не будет создан вывод. Выходной сигнал длиннее любого из входных данных.
Следовательно, новое распределение должно быть сделано для хранения результата такой конкатенации. Исходные строки освобождаются , но они представляют собой небольшие блоки памяти.
В случае 'str1' . 'str2' . 'str3' . 'str4'
у вас есть несколько темпов, создаваемых в каждом. - и ни один из них не помещается в пространство, которое было освобождено. Скорее всего, строки не располагаются в смежной памяти (то есть каждая строка есть, но различные строки не располагаются вплотную) из-за других видов использования памяти. Таким образом, освобождение строки создает проблему, поскольку пространство не может быть эффективно использовано повторно. Таким образом, вы растете с каждым созданным TMP. И вы ничего не используете повторно, никогда.
Используя имплозу на основе массива, вы создаете только 1 выходной сигнал - именно ту длину, которая вам требуется. Выполняется только 1 дополнительное выделение. Таким образом, он намного эффективнее использует память и не страдает от фрагментации конкатенации. То же самое относится и к питону. Если вам нужно объединить строки, более чем одна конкатенация всегда должна быть основана на массиве:
''.join(['str1','str2','str3'])
в питоне
implode('', array('str1', 'str2', 'str3'))
в PHP
эквиваленты sprintf также хороши.
Память, о которой сообщает memory_get_peak_usage, в основном всегда является «последним» битом памяти в виртуальной карте, которую она должна была использовать. Так как он постоянно растет, он сообщает о быстром росте. Поскольку каждое выделение находится «в конце» текущего используемого блока памяти.