PHP: разница в производительности между строкой concat и содержимым буферизации - PullRequest
6 голосов
/ 04 августа 2011

Я делаю много конкатенации строк в коде и затем отображаю вывод.Мне было интересно, есть ли какая-либо разница между следующими двумя кодами:

string concat

$str = '';
for($x =0; $x <= 10000; $x++):
    $str .= 'I am string '. $x . "\n";
endforeach;

Буферизация вывода

 ob_start();
 for($x =0; $x <= 10000; $x++):
    echo 'I am string ', $x , "\n";
 endforeach;
 $str = ob_get_contents();
 ob_end_flush();

Ответы [ 3 ]

6 голосов
/ 04 августа 2011

Вот вам эталонный тест:

<?php

$test_1_start = microtime();

$str = '';
for ( $x = 0; $x <= 10000; $x++ ) {
    $str .= 'I am string ' . $x . "\n";
}

$test_1_end = microtime();
unset($str);
echo 'String concatenation: ' . ( $test_1_end - $test_1_start ) . ' seconds';

$test_2_start = microtime();

ob_start();
for ( $x = 0; $x <= 10000; $x++ ) {
    echo 'I am string ', $x, "\n";
}
$str = ob_get_contents();
ob_end_clean();

$test_2_end = microtime();

echo "\nOutput buffering: " . ( $test_2_end - $test_2_start ) . ' seconds';

?>

Мои результаты:

$ php -v
PHP 5.3.4 (cli) (built: Dec 15 2010 12:15:07) 
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
$ php test.php
String concatenation: 0.003932 seconds
Output buffering: 0.002841 seconds%
$ php test.php
String concatenation: 0.004179 seconds
Output buffering: 0.002796 seconds%
$ php test.php
String concatenation: 0.006768 seconds
Output buffering: 0.002849 seconds%
$ php test.php
String concatenation: 0.004925 seconds
Output buffering: 0.002764 seconds%
$ php test.php
String concatenation: 0.004066 seconds
Output buffering: 0.002792 seconds%
$ php test.php
String concatenation: 0.004049 seconds
Output buffering: 0.002837 seconds%

Похоже, буферизация вывода + echo постоянно быстрее, по крайней мере в CLI / на моемmachine.

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

1 голос
/ 04 августа 2011

Я сделал тест, используя OB быстрее.

String: 0.003571 seconds
Output Buffer: 0.003053 seconds
StringBuilder (custom class Java/C#-Like): 0.050148 seconds
Array and Implode: 0.006248 seconds
0 голосов
/ 04 августа 2011

в первых кодах, которые вы пишете, вы присваиваете строку, которая будет сохраняться, пока вы не сбросите переменную. Это останется в памяти.

на втором; op_start для буферизации вывода. Пока вы не закончите его, он будет храниться в буфере. ob end отправит выходные данные из скрипта, и буфер будет очищен.

вместо использования переменных или другой вещи; если вам не нужно ничего делать с выводом позже, просто используйте echo и освободите память. Не используйте ненужные переменные.

еще одно преимущество ob_start в том, что вы можете использовать его с обратным вызовом.

Смотри здесь http://php.net/manual/en/function.ob-start.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...