Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: вопрос по ob_start()
Форумы портала PHP.SU » » Вопросы новичков » вопрос по ob_start()

Страниц (1): [1]
 

1. Eazy-E - 15 Ноября, 2011 - 10:45:39 - перейти к сообщению
Добрового времени суток, уважаемые форумчане. ob_start() сильно тормозит работу скрипта и вывод исходной страницы пользователю?

Заранее благодарю за ответы. Улыбка
2. EuGen - 15 Ноября, 2011 - 11:03:47 - перейти к сообщению
Можно просто проверить, эксперимента ради.
Вот bench.php:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. function benchmark($func, $args, $times)
  3. {
  4.         $max=(int)$times;
  5.         $time_start     = microtime(true);
  6.         $mem_start      = memory_get_usage();
  7.         for($i=0; $i<$max; $i++)
  8.         {
  9.                 call_user_func_array($func, $args);
  10.         }
  11.         $time_end       = microtime(true);
  12.         $mem_end        = memory_get_usage();
  13.         return array(
  14.                 'time'  => $time_end - $time_start,
  15.                 'memory'=> $mem_end  - $mem_start
  16.         );
  17. }
  18.  
  19. var_dump(benchmark(function()
  20.         {
  21.                 ob_start();
  22.                 echo("ZZZZZZZZ");
  23.                 ob_end_flush();
  24.         },array(),$_SERVER['argv'][1]));
  25. var_dump(benchmark(function()
  26.         {
  27.                 echo("ZZZZZZZZ");
  28.         },array(),$_SERVER['argv'][1]));


Запуская, скажем, 10000 раз, видим:
CODE (htmlphp):
скопировать код в буфер обмена
  1. user@host:/path$ php bench.php 1000000 | grep -v "Z"
  2.   ["time"]=>
  3.   float(18.142766952515)
  4.   ["memory"]=>
  5.   int(248)
  6. }
  7.   ["time"]=>
  8.   float(9.7588059902191)
  9.   ["memory"]=>
  10.   int(192)
  11. }

- уменьшение производительности составляет около 100% - предлагаю подумать почему.
3. Eazy-E - 15 Ноября, 2011 - 11:15:55 - перейти к сообщению
EuGen пишет:
user@host:/path$ php bench.php 1000000 | grep -v "Z"


Значит все таки 1000000 раз? Все равно плохо.. Просто начал авторизацию делать, при нажатии на "Выход" срабатывает редирект. Без этой функции нифига не работает. С другой стороны буферизация используется в многих cms, и не сказать что они так уж медленно работают
4. EuGen - 15 Ноября, 2011 - 11:22:54 - перейти к сообщению
Eazy-E пишет:
Значит все таки 1000000 раз?

Нет, конечно же нет. Примерно в два раза - смотрите внимательно код. 1000000 - это число повторений исполнения кода, чтобы можно было говорить о более-менее достоверных статистических данных.
5. Самогонщик - 15 Ноября, 2011 - 11:25:23 - перейти к сообщению
Из теста видно, что ни разу не медленно, если взять время вывода содержимого страницы (именно операции вывода, а не генерации контента), то накладные расходы ob_start(); выглядят не такими уж накладными.
6. Eazy-E - 15 Ноября, 2011 - 11:33:01 - перейти к сообщению
Самогонщик пишет:
Из теста видно, что ни разу не медленно, если взять время вывода содержимого страницы (именно операции вывода, а не генерации контента), то накладные расходы ob_start(); выглядят не такими уж накладными.


Вы меня радуете Улыбка Действительно, если не использовать ob_start, то и заголовки уже никак не отправить если была включена session_start().. Или я снова ошибаюсь? Просто без редиректа вообще никак..
7. Мелкий - 15 Ноября, 2011 - 11:35:46 - перейти к сообщению
Тот же тест:
CODE (htmlphp):
скопировать код в буфер обмена
  1. user@brtech-ws-03:~$ php -f testf.php 1000000 | grep -v "Z"
  2.   ["time"]=>
  3.   float(4.4153249263763)
  4.   ["memory"]=>
  5.   int(304)
  6. }
  7.   ["time"]=>
  8.   float(3.4117238521576)
  9.   ["memory"]=>
  10.   int(240)
  11. }
  12. user@brtech-ws-03:~$ php -f testf.php 10000000 | grep -v "Z"
  13.   ["time"]=>
  14.   float(44.279800891876)
  15.   ["memory"]=>
  16.   int(304)
  17. }
  18.   ["time"]=>
  19.   float(33.254997014999)
  20.   ["memory"]=>
  21.   int(240)
  22. }

Отстаём только на треть.
PHP5.3.5

И даже так:
CODE (htmlphp):
скопировать код в буфер обмена
  1. php -f bench.php 1000000 | grep -v Z
  2.   ["time"]=>
  3.   float(43.827120065689)
  4.   ["memory"]=>
  5.   int(168)
  6. }
  7.   ["time"]=>
  8.   float(41.192767858505)
  9.   ["memory"]=>
  10.   int(132)
  11. }

виртуалка с PHP 5.3.3
8. Eazy-E - 15 Ноября, 2011 - 11:39:16 - перейти к сообщению
Думаю это норма Улыбка
9. EuGen - 15 Ноября, 2011 - 12:33:49 - перейти к сообщению
Самогонщик пишет:
(именно операции вывода, а не генерации контента)

это существенное уточнение. В этом случае верно, проигрыш будет невелик.

 

Powered by ExBB FM 1.0 RC1