Начинаю осваивать ООП. Для сравнения быстродействия выполнил: PHP: <hr />Процедурно:<br /> <?php $st = microtime(true); function show() { $array = array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20); $pg = (isset($_GET['pg'])) ? ($_GET['pg']-1):0; $start = abs($pg*5); $stop = $start+5-1; for($i = $start; $i <= $stop; $i++) { if(@$array[$i] == false) break; @$data .= $array[$i]."<br />"; } return $data; } echo show(); echo number_format(microtime(true)-$st, 8); ?> <hr />Обьектно-ориентированно:<br /> <?php $st = microtime(true); class test { private $array = array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20); private function calculate() { $pg = (isset($_GET['pg'])) ? ($_GET['pg']-1):0; $data['start'] = abs($pg*5); $data['stop'] = $data['start']+5-1; return $data; } public function show() { $data = $this->calculate(); for($i = $data['start']; $i <= $data['stop']; $i++) { if($this->array[$i] == false) break; @$echo_data .= $this->array[$i]."<br />"; } return $echo_data; } } $test = new test(); echo $test->show(); echo number_format(microtime(true)-$st, 8); ?> За ООП-говнокод не ругать, я сегодня только углубленно принялся изучать . Этот скрипт просто выводит 5 элементов массива $array в зависимости от значения pg, переданного гетом (банальный пейджер, или как там его). ООП выполнилось в 2 раза быстрее!! До этого слышал, что простые действия быстрее выполняются процедурно. Отсюда вопрос к более опытным программистам: все ли действия сложнее этого будут выполняться в 2 раза быстрее, или у ООП есть слабые стороны? Боюсь я сувать его везде. upd: 2moders: хотел добавить в блондинки, получилось почему-то в помойку) перенесите, если "не в тему" попал.
Пример, для теста производительности очень не удачный. Слишком мало время выполнения скрипта и будет приблизительно равно погрешности. Мои результаты трех запусков Процедурно: 0.00054312 Обьектно-ориентированно: 0.00063014 Процедурно: 0.00052786 Обьектно-ориентированно: 0.00051808 Процедурно: 0.00053215 Обьектно-ориентированно: 0.00047112
Горбунов Олег Ух-ты, на Linux показывает равные результаты, в win - ООП рулит. Амплитуда действительно не стабильная в linux. То поровну, то ООП быстрее намного.
+Sten+, а еще сильно зависит от того, КАК привязан php к вебсеверу. Советую для чистоты эксперимента запускать из командной строки.
Спасибо всем за ответы, как я понял, однозначного ответа на мой вопрос: нет и быть не может, слишком много факторов влияет на это. Буду набираться опытом.
Еще раз хотелось обратить внимание, что данный тест не показатель производительности, так как погрешность измерения сравнима (а, может и больше) самих значений. Например, добавив в конце такие строки PHP: <hr />Чистый вывод:<br /> <?php $st = microtime(true); echo "1<br />"; echo "2<br />"; echo "3<br />"; echo "4<br />"; echo "5<br />"; echo number_format(microtime(true)-$st, 8); ?> Я получил результат Процедурно: 0.00191689 Обьектно-ориентированно: 0.00088096 Чистый вывод: 0.00118494 Процедурно: 0.00170612 Обьектно-ориентированно: 0.00104499 Чистый вывод: 0.00118899 И что мы видим. Чистое echo работает медленнее ООП +Sten+, если хотите проверить производительность на тестах, создайте тест, который будет выполняться хотя бы секунд 20-30.
Mavir Дело в том, что корректный тест секунд на 20-30 создать будет тоже довольно трудно. Например, я могу в тот же массив записать миллион записей, при этом время обработки этих записей будет одинакова и в ПП и ОО. В моём случае я просто разделил код процедурного варианта на 2 части: подсчет (calculate()) и вывод (show()). При этом работа, выполняемая двумя скриптами - одинакова, вот она: PHP: for($i = $data['start']; $i <= $data['stop']; $i++) { if($this->array[$i] == false) break; @$echo_data .= $this->array[$i]."<br />"; } И PHP: for($i = $start; $i <= $stop; $i++) { if(@$array[$i] == false) break; @$data .= $array[$i]."<br />"; } и выполняется она за одинаковое время. В то же время, в моём скрипте ООП демонстрирует большую быстроту, и из этого можно сделать вывод, что (сложно сформулировать) в ООП доступ к данным подсчёта (calculate()) проходит быстрей. Поправьте меня, если я неправльно мыслю.
В одном скрипте за один запуск выполнил пять раз всего три строки PHP: <? $st = microtime(true); echo show(); echo number_format(microtime(true)-$st, 8); ?> Результаты: 0.00079584 0.00040793 0.00054312 0.00042009 0.00043321 Т.е. следуя Вашей логике, значения должны абсолютно одинаковы (или в крайнем случае различаться в последней цифре), так как скрипт выполняется за одно и тоже время одно и тоже действие.