За последние 24 часа нас посетили 16637 программистов и 1649 роботов. Сейчас ищут 2014 программистов ...

Вопрос по ООП

Тема в разделе "Вопросы от блондинок", создана пользователем +Sten+, 9 ноя 2007.

  1. +Sten+

    +Sten+ Активный пользователь

    С нами с:
    27 авг 2007
    Сообщения:
    978
    Симпатии:
    0
    Начинаю осваивать ООП. Для сравнения быстродействия выполнил:
    PHP:
    1.  
    2. <hr />Процедурно:<br />
    3. <?php
    4.  
    5. $st = microtime(true);
    6.  
    7. function show()
    8. {
    9.  $array = array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20);
    10.  $pg = (isset($_GET['pg'])) ? ($_GET['pg']-1):0;
    11.  
    12.  $start = abs($pg*5);
    13.  $stop = $start+5-1;
    14.  
    15.  for($i = $start; $i <= $stop; $i++)
    16.  {
    17.   if(@$array[$i] == false) break;
    18.   @$data .= $array[$i]."<br />";
    19.  }
    20.  return $data;
    21. }
    22.  
    23. echo show();
    24.  
    25. echo number_format(microtime(true)-$st, 8);
    26.  
    27. ?>
    28.  
    29. <hr />Обьектно-ориентированно:<br />
    30. <?php
    31.  
    32. $st = microtime(true);
    33.  
    34. class test
    35. {
    36.  private $array = array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20);
    37.  
    38.  private function calculate()
    39.  {
    40.   $pg = (isset($_GET['pg'])) ? ($_GET['pg']-1):0;
    41.  
    42.   $data['start'] = abs($pg*5);
    43.   $data['stop'] = $data['start']+5-1;
    44.   return $data;
    45.  }
    46.  
    47.  public function show()
    48.  {
    49.   $data = $this->calculate();
    50.  
    51.   for($i = $data['start']; $i <= $data['stop']; $i++)
    52.   {
    53.    if($this->array[$i] == false) break;
    54.    @$echo_data .= $this->array[$i]."<br />";
    55.   }
    56.   return $echo_data;
    57.  }
    58. }
    59. $test = new test();
    60. echo $test->show();
    61.  
    62. echo number_format(microtime(true)-$st, 8);
    63.  
    64. ?>
    65.  
    За ООП-говнокод не ругать, я сегодня только углубленно принялся изучать :).

    Этот скрипт просто выводит 5 элементов массива $array в зависимости от значения pg, переданного гетом (банальный пейджер, или как там его).

    ООП выполнилось в 2 раза быстрее!! До этого слышал, что простые действия быстрее выполняются процедурно.

    Отсюда вопрос к более опытным программистам: все ли действия сложнее этого будут выполняться в 2 раза быстрее, или у ООП есть слабые стороны? Боюсь я сувать его везде.

    upd: 2moders: хотел добавить в блондинки, получилось почему-то в помойку) перенесите, если "не в тему" попал.
     
  2. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Всё дело в ZE2, попробуй в PHP 4 проверить.
     
  3. Mavir

    Mavir Guest

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

    Мои результаты трех запусков

    Процедурно: 0.00054312
    Обьектно-ориентированно: 0.00063014

    Процедурно: 0.00052786
    Обьектно-ориентированно: 0.00051808

    Процедурно: 0.00053215
    Обьектно-ориентированно: 0.00047112
     
  4. +Sten+

    +Sten+ Активный пользователь

    С нами с:
    27 авг 2007
    Сообщения:
    978
    Симпатии:
    0
    Sergey89
    Всё равно в 2 раза быстрее :) PHP 4.4.4.

    Сейчас прогуглю что за ZE2.
     
  5. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    +Sten+
    А почему в процедурном варианте 2 "собачки", а в ОО - всего одна?
     
  6. +Sten+

    +Sten+ Активный пользователь

    С нами с:
    27 авг 2007
    Сообщения:
    978
    Симпатии:
    0
    Dagdamor
    Забыл) как ни тупо это звучит :roll:
    Mavir
    У меня стабильно: ~0.00013185 vs ~0.00007915.
     
  7. Anonymous

    Anonymous Guest

    Ага, ага... платформу исполнения забыли.
     
  8. +Sten+

    +Sten+ Активный пользователь

    С нами с:
    27 авг 2007
    Сообщения:
    978
    Симпатии:
    0
    Горбунов Олег
    Ух-ты, на Linux показывает равные результаты, в win - ООП рулит. Амплитуда действительно не стабильная в linux. То поровну, то ООП быстрее намного.
     
  9. Anonymous

    Anonymous Guest

    +Sten+, а еще сильно зависит от того, КАК привязан php к вебсеверу.
    Советую для чистоты эксперимента запускать из командной строки. ;)
     
  10. +Sten+

    +Sten+ Активный пользователь

    С нами с:
    27 авг 2007
    Сообщения:
    978
    Симпатии:
    0
    Спасибо всем за ответы, как я понял, однозначного ответа на мой вопрос:
    нет и быть не может, слишком много факторов влияет на это.
    Буду набираться опытом.
     
  11. Mavir

    Mavir Guest

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

    Например, добавив в конце такие строки
    PHP:
    1. <hr />Чистый вывод:<br />
    2. <?php
    3.  
    4.   $st = microtime(true);
    5.   echo "1<br />";
    6.   echo "2<br />";
    7.   echo "3<br />";
    8.   echo "4<br />";
    9.   echo "5<br />";
    10.   echo number_format(microtime(true)-$st, 8);
    11.  
    12. ?>
    Я получил результат

    Процедурно: 0.00191689
    Обьектно-ориентированно: 0.00088096
    Чистый вывод: 0.00118494

    Процедурно: 0.00170612
    Обьектно-ориентированно: 0.00104499
    Чистый вывод: 0.00118899

    И что мы видим. Чистое echo работает медленнее ООП


    +Sten+, если хотите проверить производительность на тестах, создайте тест, который будет выполняться хотя бы секунд 20-30.
     
  12. +Sten+

    +Sten+ Активный пользователь

    С нами с:
    27 авг 2007
    Сообщения:
    978
    Симпатии:
    0
    Mavir
    Дело в том, что корректный тест секунд на 20-30 создать будет тоже довольно трудно. Например, я могу в тот же массив записать миллион записей, при этом время обработки этих записей будет одинакова и в ПП и ОО.
    В моём случае я просто разделил код процедурного варианта на 2 части: подсчет (calculate()) и вывод (show()). При этом работа, выполняемая двумя скриптами - одинакова, вот она:

    PHP:
    1.  
    2. for($i = $data['start']; $i <= $data['stop']; $i++)
    3. {
    4.  if($this->array[$i] == false) break;
    5.  @$echo_data .= $this->array[$i]."<br />";
    6. }
    7.  
    И
    PHP:
    1.  
    2.   for($i = $start; $i <= $stop; $i++)
    3.   {
    4.    if(@$array[$i] == false) break;
    5.    @$data .= $array[$i]."<br />";
    6.   }
    7.  
    и выполняется она за одинаковое время.

    В то же время, в моём скрипте ООП демонстрирует большую быстроту, и из этого можно сделать вывод, что (сложно сформулировать) в ООП доступ к данным подсчёта (calculate()) проходит быстрей.

    Поправьте меня, если я неправльно мыслю.
     
  13. Mavir

    Mavir Guest

    В одном скрипте за один запуск выполнил пять раз всего три строки
    PHP:
    1. <?
    2. $st = microtime(true);
    3. echo show();
    4. echo number_format(microtime(true)-$st, 8);
    5. ?>
    6.  
    Результаты:

    0.00079584
    0.00040793
    0.00054312
    0.00042009
    0.00043321

    Т.е. следуя Вашей логике, значения должны абсолютно одинаковы (или в крайнем случае различаться в последней цифре), так как скрипт выполняется за одно и тоже время одно и тоже действие.