Задача:
Собрать машину времени, используя буферизацию вывода, т.е., по ходу генерации контента вешаем якорь, после отработки некой части скрипта этот якорь заменяем значением, полученным в результате работы самого скрипта, на пальцах:
ob_start();
echo "Hello";
echo "temp_var";
echo "world";
$content = ob_get_clean();
$value = ", ";
$content = str_replace("temp_var", $value, $content);
echo $content;
В результате имеем:
Hello, world
Что я подумал, искать в тексте over99999 символов подстроки и заменять их - процесс долгий, я попробовал сделать так:
ob_start();
echo "Hello";
$length = ob_get_length();
echo "world";
$content = ob_get_clean();
$value = ", ";
$content = substr($content, 0, $length) . $value . substr($content, $length);
echo $content;
Результат тот же самый, теперь мы разбиваем строку substr`ами.
Ещё один вариант (душа гуляет):
$content = "";
$i = 0;
ob_start();
echo "Hello";
$content[$i++] = ob_get_contents();
ob_clean();
$params[] = $i;
$content[$i++] = 'temp_val';
ob_start();
echo "world";
$content[$i++] = ob_get_contents();
ob_clean();
$values['temp_val'] = ", ";
$arr = array_combine($params, $values);
$content = array_replace($content, $arr);
echo implode("", $content);
Опять получаем желаемый результат, теперь всё заморочено, работаем только с массивами и их ключами.
Выглядит немного кривовастенько, но оно всё в классе, вытащил для удобства.
И вот в чём вопрос: насколько я помню из си, строки - это массивы символов, массивы - это указатели на ячейку в памяти, соответственно, я себе жизнь представляю так, что для процессора выполнять операцию сложения (substr($content, 0, $l)) немного легче, чем искать подстроки, посему вопрос, почему результаты работы по времени такие:
1. 0.00072193145751953
2. 0.022955894470215
3. 0.0061380863189697
Результаты работы приведены для текста длинною 40 000 латинских символов, в котором необходимо произвести 1000 замен.
Или, если есть альтернативный способ нахождения истины - подкиньте функцию..