[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: echo vs printf()
Invis1ble
Решил создать этот топик, т.к. достало, что новички-поповисты юзают повсеместно (где надо и где не надо) функцию printf()... По древу мыслью растекаться не буду, а выложу тестовый код, который только что написал. О результатах работы кода судите сами ;)
<?php

$var1 = 'Пиво';
$var2 = 'шампанское';
$var3 = 'водка';
$var4 = 'коньяк';
$var5 = 'спирт';

$echoStartTime = microtime(true);

for ($i = 0; $i < 10000; $i ++)
echo $var1 . ', ' . $var2 . ', ' . $var3 . ', ' . $var4 . ' и т.п. напитки плохо влияют на мозг программиста, так как содержат ' . $var5 . '.<br />';

$echoFinishTime = microtime(true);
$printfStartTime = microtime(true);

for ($i = 0; $i < 10000; $i ++)
printf('%s, %s, %s, %s и т.п. напитки плохо влияют на мозг программиста, так как содержат %s.<br />', $var1, $var2, $var3, $var4, $var5);

$printfFinishTime = microtime(true);

printf('Время выполнения оператора echo: %.5f сек<br />', $echoFinishTime - $echoStartTime); // а вот здесь использование printf() вполне оправдано ;)
printf('Время выполнения функции printf: %.5f сек', $printfFinishTime - $printfStartTime); // и здесь тоже

Просьба к экспертам - если есть замечания по корректности сравнения работы в данном контексте, то обязательно выскажите их.

P.S. Заранее прошу прощения за длину строк )



Спустя 46 минут, 16 секунд (4.01.2011 - 03:22) inpost написал(а):
Ага, и что мы видем... printf быстрее о_О
Эксперты, объясните, как printf может быть быстрее и почему? Тестирую на хостинге.

Спустя 13 минут, 4 секунды (4.01.2011 - 03:35) Invis1ble написал(а):
Мной и камрадом inpost'ом замечена странная тенденция - на удаленном сервере данный скрипт выдает, что printf() работает быстрее, а на локальном - echo побеждает huh.gif
Какие у кого есть мысли? Разница скорости - приблизительно 2 раза....

Спустя 10 минут, 52 секунды (4.01.2011 - 03:46) inpost написал(а):
Я проверил результаты, кому интересно: inpost.dp.ua/9/test3.php
Результаты неутешительные на моём хостинге:
0.0430760383606
0.0279979705811

А это говорит о том, что printf пошел быстрее! Проверил тот же скрипт на локале - быстрее оказался именно echo.

Вот сам скрипт:
<?php
header("Content-Type: text/html; charset=utf-8");
error_reporting(E_ALL & ~E_NOTICE);

$var1 = 'ПBeer104-_ я';
$var2 = 'шампанское, что ещё надо для счастья';
$var3 = 'водкааас!у жж ==';
$var4 = '5+5=4 и это мы проходили в школе, когда было нам всего 5 лет';
$var5 = 5;

echo '<div style="display:none">';

$echoStartTime = microtime(true);

for ($i = 0; $i < 10000; $i ++)
echo $var1 . ', ' . $var2 . ', ' . $var3 . ', ' . $var4 . ' и т.п. напитки плохо влияют на мозг программиста, так как содержат ' . $var5 . '.<br />';

$echoFinishTime = microtime(true);
$printfStartTime = microtime(true);

for ($i = 0; $i < 10000; $i ++)
printf('%s, %s, %s, %s и т.п. напитки плохо влияют на мозг программиста, так как содержат %s.<br />', $var1, $var2, $var3, $var4, $var5);

$printfFinishTime = microtime(true);

echo '</div>';

echo $echoFinishTime - $echoStartTime;
echo '<br />';
echo $printfFinishTime - $printfStartTime;


Теперь этот скрипт запустил на ирбисовском хостинге, результаты:
0.078742980957031
0.076610803604126

0.11012506484985
0.092545986175537

0.076194047927856
0.076432228088379

0.079121112823486
0.076653003692627


Американский хостинг:
11.2165789604
10.562723875

11.0589630604
10.3998110294

Теперь смотрим 4-ый хостинг и вуаля, echo быстрее(!):
0.029007196426392
0.038628101348877

Ещё один укр. хостинг:
6.7295589447021
6.6486210823059

6.7310688495636
6.2623281478882

4.6341018676758
4.5853488445282


А дальне немного с буфером поизвращаемся:
<?php
$t = microtime(true);
header("Content-Type: text/html; charset=utf-8");
error_reporting(E_ALL & ~E_NOTICE);

$var1 = 'ПBeer104-_ я';
$var2 = 'шампанское, что ещё надо для счастья';
$var3 = 'водкааас!у жж ==';
$var4 = '5+5=4 и это мы проходили в школе, когда было нам всего 5 лет';
$var5 = 5;

ob_start();
echo '<div style="display:none">';

$echoStartTime = microtime(true);

for ($i = 0; $i < 10000; $i ++)
echo $var1 . ', ' . $var2 . ', ' . $var3 . ', ' . $var4 . ' и т.п. напитки плохо влияют на мозг программиста, так как содержат ' . $var5 . '.<br />';

$echoFinishTime = microtime(true);
$printfStartTime = microtime(true);

for ($i = 0; $i < 10000; $i ++)
printf('%s, %s, %s, %s и т.п. напитки плохо влияют на мозг программиста, так как содержат %s.<br />', $var1, $var2, $var3, $var4, $var5);

$printfFinishTime = microtime(true);

echo '</div>';
$body = ob_get_contents();
ob_end_clean();

$t2 = microtime(true);
echo $body;
echo microtime(true) - $t2;
echo '<br />';
$t2 = microtime(true);
printf('%s',$body);
echo microtime(true) - $t2;


echo '<br />';

echo $echoFinishTime - $echoStartTime;
echo '<br />';
echo $printfFinishTime - $printfStartTime;
echo '<br />';
echo microtime(true) - $t;

Результат:
0.0433709621429 - echo из буфера
0.0311758518219 - printf из буфера
0.013365983963
0.026447057724
0.121402978897

Спустя 13 минут, 32 секунды (4.01.2011 - 04:00) Invis1ble написал(а):
Мои результаты по первому скрипту (localhost):

Время выполнения оператора echo: 1.27611 сек
Время выполнения функции printf: 2.07363 сек

Время выполнения оператора echo: 0.88278 сек
Время выполнения функции printf: 1.97499 сек

Время выполнения оператора echo: 0.87592 сек
Время выполнения функции printf: 2.00463 сек

Эксперимент из серии удивительное - рядом biggrin.gif

Спустя 46 минут, 59 секунд (4.01.2011 - 04:47) Guest написал(а):
А вот мой результат с буфером на денвере.
0.00455594062805
0.0981829166412

Спустя 2 минуты, 1 секунда (4.01.2011 - 04:49) kovaldm написал(а):
Цитата
А вот мой результат с буфером на денвере.
0.00455594062805
0.0981829166412

Это я.
Получается что echo в 24 раза быстрее.

Спустя 10 минут, 57 секунд (4.01.2011 - 05:00) inpost написал(а):
Здравствуй мама, новый год... запускаем и смотрим, особенно любители красивых кодов:
<?php
$t = microtime(true);
header("Content-Type: text/html; charset=utf-8");
error_reporting(E_ALL & ~E_NOTICE);

$var1 = 'ПBeer104-_ я';
$var2 = 'шампанское, что ещё надо для счастья';
$var3 = 'водкааас!у жж ==';
$var4 = '5+5=4 и это мы проходили в школе, когда было нам всего 5 лет';
$var5 = 5;

echo '<div style="display:none">';

$echoStartTime = microtime(true);
for ($i = 0; $i < 10000; $i ++)
echo $var1 . ', ' . $var2 . ', ' . $var3 . ', ' . $var4 . ' и т.п. напитки плохо влияют на мозг программиста, так как содержат ' . $var5 . '.<br />';
$echoFinishTime = microtime(true);

$echo2StartTime = microtime(true);
for ($i = 0; $i < 10000; $i ++)
echo $var1.', '.$var2.', '.$var3.', '.$var4.' и т.п. напитки плохо влияют на мозг программиста, так как содержат '.$var5.'.<br />';
$echo2FinishTime = microtime(true);

$echo3StartTime = microtime(true);
for ($i = 0; $i < 10000; $i ++)
echo $var1.", ".$var2.", ".$var3.", ".$var4." и т.п. напитки плохо влияют на мозг программиста, так как содержат ".$var5.".<br />";
$echo3FinishTime = microtime(true);

$printfStartTime = microtime(true);
for ($i = 0; $i < 10000; $i ++)
printf('%s, %s, %s, %s и т.п. напитки плохо влияют на мозг программиста, так как содержат %s.<br />', $var1, $var2, $var3, $var4, $var5);
$printfFinishTime = microtime(true);

$printStartTime = microtime(true);
for ($i = 0; $i < 10000; $i ++)
print $var1 . ', ' . $var2 . ', ' . $var3 . ', ' . $var4 . ' и т.п. напитки плохо влияют на мозг программиста, так как содержат ' . $var5 . '.<br />';
$printFinishTime = microtime(true);

$print2StartTime = microtime(true);
for ($i = 0; $i < 10000; $i ++)
print $var1.', '.$var2.', '.$var3.', '.$var4.' и т.п. напитки плохо влияют на мозг программиста, так как содержат '.$var5.'.<br />';
$print2FinishTime = microtime(true);

$oStartTime = microtime(true);
for ($i = 0; $i < 10000; $i ++)
{ ?>
<?php
echo $var1; ?>, <?php echo $var2; ?>, <?php echo $var3; ?>, <?php echo $var4; ?> и т.п. напитки плохо влияют на мозг программиста, так как содержат <?php echo $var5; ?>.<br />
<?php }
$oFinishTime = microtime(true);

echo '</div>';


echo $echoFinishTime - $echoStartTime;
echo ' - echo<br />';
echo $echo2FinishTime - $echo2StartTime;
echo ' - echo2 (without space)<br />';
echo $echo3FinishTime - $echo3StartTime;
echo ' - echo3 (without space)<br />';
echo $printfFinishTime - $printfStartTime;
echo ' - printf<br />';
echo $printFinishTime - $printStartTime;
echo ' - print<br />';
echo $print2FinishTime - $print2StartTime;
echo ' - print (without space)<br />';
echo $oFinishTime - $oStartTime;
echo ' - \<\?php \?\><br />';
echo microtime(true) - $t;


Как оказалось, быстрее всех справился echo без всяких там красивых пробелов между логическими частями. Обращаю внимание, что красивые пробелы прекрасно работают в денвере, но отвратительно на хостингах. Эхо с пробелами самый медленных на хостингах, при этом на локалке остаётся наоборот быстрее printf, в свою очередь без пробелов - быстрый везде!

Если брать маленькие объемы, всего 50 выводов, то самым быстрым в итоге оказался последний тест, где закрывается PHP и вставляется только в нужных местах.

Уважаемые знатоки, не могли бы ещё вы поделиться своими заметками?

Спустя 5 часов, 50 минут, 28 секунд (4.01.2011 - 10:50) twin написал(а):
Цитата
Как оказалось, быстрее всех справился echo без всяких там красивых пробелов между логическими частями.

Ну а чего вообще весь код в одну строчку не вытянул? Еще быстрее будет.

И еще, почему никто не померял echo с запятыми? Я не буду этого делать ввиду полной бесполезности этих занятий, но больше чем уверен, что с запятой еще быстрее получится.

На самом деле скорость выполнения таких скриптов - показатель последний.
Где вы видели вывод через echo или print (printf) в цикле в таких количествах? А время исполнения вывода в нормальных скриптах разнится на такие микроскопические величины, что даже сама постановка вопроса - кто быстрее, echo или printf - звучит по меньшей мере смешно.

А вот такая вещь, как читабельность кода (а значит его управляемость), дело крайне важное.

В случае с printf это даже обсуждению не подлежит - код крайне нечитабелен. Я не говорю уже о разделении логики с представлением, даже просто на месте. Посмотрите, какая каша:

printf('%s, %s, %s, %s и т.п. напитки плохо влияют на мозг программиста, так как содержат %s.<br />', $var1, $var2, $var3, $var4, $var5);


Где тут что? Сиди, считай. А если кода побольше, как у того же попова, вообще лабиринт.

Так что не грейте голову скоростью там, где она так явно противоречит читабельности, а значит и здравому смыслу.

Именно руководствуясь последним, я и не стану мерять это безобразие и выяснять, где именно допущена некорректность в тестах. Ибо все это чушь, не может функция работать быстрее языковой конструкции. Скорее всего дело в кэшировании, которое возможно только при однотипных данных на выводе. Что к реальности не имеет никакого отношения.

Спустя 1 час, 27 минут, 6 секунд (4.01.2011 - 12:17) Michael написал(а):
верно подмечено, к реальности эти замеры не имеют отношения. Реальность - это сайты которые создаются в конструкторах (без программиста) с 800 запросами на генерацию страницы. И работают. А кто то спички считает.

Спустя 1 час, 14 минут, 51 секунда (4.01.2011 - 13:32) Invis1ble написал(а):
Естественно, данный эксперемент не носит практического характера и про читабельность и так понятно.... Чисто теоритический интерес smile.gif

Спустя 1 час, 18 минут, 7 секунд (4.01.2011 - 14:50) twin написал(а):
Чисто теоретический интерес должен быть направлен в сторону созидания. А не просто так. И тем более не нужно делать поспешных выводов.

Это семантическая ошибка, коих в php, ввиду его крайней неортогональности, великое множкство.

Семантическая ошибка, это когда задачи решаются несвойственными и неоптимальными методами. Допустим никому в голову не приходит првести все буквы в нижний регистр с помощью регулярок и тем более циклов.
И совершенным безумством было бы делать какие то измерения, что круче, регулярка или strtolower()

А вот почему то функцию, призванную форматировать данные, считается в порядке вещей использовать для прямого вывода.

Только за это попова стоит расстрелять солеными огурцами.



Спустя 23 минуты, 49 секунд (4.01.2011 - 15:14) Invis1ble написал(а):
twin
предлагаю расстрелять его из двухствольного fetch_array очередью из баллистических ракет printf ph34r.gif

Спустя 3 минуты, 12 секунд (4.01.2011 - 15:17) inpost написал(а):
twin
Вопрос был совсем в другом, Инвисибл раз и на всегда хотел показать, что даже по производительности echo лучше, а на серверах результат совсем другой. Пробелы ухудшают производительность до такой степени, что printf оказывается намного лучше. В свою очередь денверу на это пофиг. Вопрос, почему так связано именно с хостингами? Почему они не могут нормально обрабатывать обычные пробелы?

А аргумент "так красивее" - совсем не аргумент для программиста =)

Спустя 23 минуты, 19 секунд (4.01.2011 - 15:41) Ihor написал(а):
У меня быстрее всего работал такой еко:
echo "{$var1}, {$var2}, {$var3}, {$var4} и т.п. напитки плохо влияют на мозг программиста, так как содержат {$var5}<br />";

А вообще думаю разница в сотые секунды при таких количествах выводов самое последнее на что нужно обращать внимание.
Я всегда где нужно просто вывести текст использую echo. А системные сообщения с локализацией через printf(). Что более удобно.

$lang['required'] = 'The %s field is required.';
printf($lang['required'], 'Email');

Спустя 1 минута, 51 секунда (4.01.2011 - 15:43) inpost написал(а):
Ihor
говорим не про сотые секунды, а результат в 1,5-1,8 отличный.

Спустя 52 минуты, 52 секунды (4.01.2011 - 16:35) T1mer написал(а):
blink.gif
Цитата
Время выполнения оператора echo: 0.15306 сек
Время выполнения функции printf: 1.23147 сек

Цитата
Время выполнения оператора echo: 0.13799 сек
Время выполнения функции printf: 1.64451 сек

blink.gif
Знал что быстрее, но чтоб настолько...
hampp linux(lampp) localhost сервер.

Спустя 13 минут, 25 секунд (4.01.2011 - 16:49) inpost написал(а):
T1mer
Вот вот, на локалке у всех класные резульаты, а вот на серваках пробелы творят тихий ужас =)

Спустя 24 минуты, 34 секунды (4.01.2011 - 17:13) twin написал(а):
Пробелы не могут творить никаких ужасов, так как код на исполнение интерпретатора передается без них. Некоторое время уходит на очистку исходного кода, но это такой мизер, что его даже измерить невозможно, так как предел погрешностей превышает его в несколько раз.

Ну вот на хостинге, меряйте.

Не там ищите, еще раз говорю. Это скорее всего связано с особенностями кэширования.

Спустя 23 минуты, 48 секунд (4.01.2011 - 17:37) sergeiss написал(а):
Цитата (inpost @ 4.01.2011 - 16:43)
говорим не про сотые секунды, а результат в 1,5-1,8 отличный.

Да, не про сотые, а про десяти- или сто- тысячные доли секунды smile.gif Ты раздели, не забудь, полученные цифры на количество циклов. И тогда будет понятно до конца утверждение Твина о том, что все эти различия - это "ловля блох" (не дословно его слова, но по сути слов).

Спустя 12 минут, 36 секунд (4.01.2011 - 17:50) Invis1ble написал(а):
twin, sergeiss
Цитата
десяти- или сто- тысячные доли секунды

"копейка рубль бережет", как-то так =)

Спустя 6 минут, 27 секунд (4.01.2011 - 17:56) waldicom написал(а):
Цитата (Invis1ble @ 4.01.2011 - 15:50)
Цитата
десяти- или сто- тысячные доли секунды

"копейка рубль бережет", как-то так =)

Ага. А время, потраченное на сбережение копейки выражается в десятках рублей

Спустя 3 минуты, 21 секунда (4.01.2011 - 18:00) Ihor написал(а):
Цитата (inpost @ 4.01.2011 - 12:43)
Ihor
говорим не про сотые секунды, а результат в 1,5-1,8 отличный.

Ну у меня результат на локалхосте(чистый LAMP) такой:
Цитата

0.085869073867798
0.099602222442627

Я просто клоню к тому что в условиях теста результат ощутимый. Но в условиях реального проекта, пускай где теоретически может быть такой цикл в 10к итераций, это будет последнее на что я обращу внимание при оптимизации.


_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.