За последние 24 часа нас посетили 18820 программистов и 1608 роботов. Сейчас ищут 998 программистов ...

Интересный результат проверки скорости скрипта

Тема в разделе "PHP для новичков", создана пользователем zzzVolkzzz, 10 апр 2009.

  1. zzzVolkzzz

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

    С нами с:
    10 апр 2009
    Сообщения:
    26
    Симпатии:
    0
    Вот решил немного побаловаться на тему что быстрей...
    Делаю шапку, т.е. подключаю класс, создаю объект(какой не важно, главное что этот класс наследует класс My_SQL), произвожу выборку...
    Код (Text):
    1.  
    2. [php]include "Classes/Calendar_class.php";
    3. $r = new Calendar('Monday','24','1');
    4. $res = $r-> select('B_Booker','id,day,time','month=? and year=? and boardroom=?','ORDER BY day')-> send_data('4','2009','1');[/php]
    Далее проверяю какой вариант обработки запроса быстрее:
    Код (Text):
    1.  
    2.  $s = microtime(true);
    3.  for ($i = 0; $i < 100000; $i++) {
    4.      test_row($res);
    5.      $i++;
    6.  }
    7.  printf('row1: %.5f<br />', microtime(true) - $s);
    8.  
    9.  $s = microtime(true);
    10.  for ($i = 0; $i < 100000; $i++) {
    11.      test_for($res);
    12.      $i++;
    13.  }
    14.  printf('for1: %.5f<br />', microtime(true) - $s);
    15.  
    16.  function test_row($res) {
    17.     $rows=mysql_num_rows($res);
    18.     for($i=0;$i<$rows;$i++) {
    19.         $value[]=mysql_fetch_assoc($res);
    20.     }
    21.  }
    22.  
    23.  function test_for($res) {
    24.     for ($value=array(); $row=mysql_fetch_assoc($res);){
    25.          $value[]=$row;
    26.     };
    27.  }
    результат:
    Код (Text):
    1.  
    2. row1: 0.49916
    3. for1: 0.16592
    все класс, 'for' форэвэр доволен. Вот только черт дернул проверить а сколько же средняя скорость запроса:

    Код (Text):
    1.  
    2.  for ($i = 0; $i < 100000; $i++) {
    3.      $k += test_row2($res);
    4.      $i++;
    5.  }
    6.  printf('row2: %.10f<br />', $k/100000);
    7.  
    8.  for ($i = 0; $i < 100000; $i++) {
    9.      $k += test_for2($res);
    10.      $i++;
    11.  }
    12.  printf('for2: %.10f<br />', $k/100000);
    13.  
    14.  function test_row2($res) {
    15.     $s = microtime(true);
    16.     $rows=mysql_num_rows($res);
    17.     for($i=0;$i<$rows;$i++) {
    18.         $value[]=mysql_fetch_assoc($res);
    19.     }
    20.     return microtime(true) - $s;
    21.  }
    22.  
    23.  function test_for2($res) {
    24.     $s = microtime(true);
    25.     for ($value=array(); $row=mysql_fetch_assoc($res);){
    26.          $value[]=$row;
    27.     };
    28.     return microtime(true) - $s;
    29.  }
    А вот результат получаеться обратный... первый метод лучше:
    Код (Text):
    1.  
    2. row2: 0.0000061569
    3. for2: 0.0000097015
    :shock:

    Получаеться так:
    Код (Text):
    1.  
    2. row1: 0.49916
    3. for1: 0.16592
    4. row2: 0.0000061569
    5. for2: 0.0000097015
    :shock: :shock: :shock:

    Может ктото сказать почему результат противоположный получился?
    Или где я ошибся?
     
  2. Ti

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

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    результаты запроса база кеширует (попробуйте в первом тесте поменять тесты местами).
    во втором случае это не так отразилось на резултаты первого метода.

    P.S. PDO рулит.
    PHP:
    1. <?
    2. $db = new PDO('mysql:host=localhost;dbname=testdb');
    3. foreach($db->query('SELECT name, colour, calories FROM fruit ORDER BY name') as $row) {
    4.      print $row['name'] . "\t";
    5.      print $row['colour'] . "\t";
    6.      print $row['calories'] . "\n";
    7. }
    8.  
     
  3. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    zzzVolkzzz
    PHP:
    1. <?php
    2. for ($i = 0; $i < 100000; $i++) {
    3.      $k += test_row2($res);
    4.      $i++;
    5.  }
    6.  printf('row2: %.10f<br />', $k/100000);
    7.  
    8.  for ($i = 0; $i < 100000; $i++) {
    9.      $k += test_for2($res);
    10.      $i++;
    11.  }
    12.  printf('for2: %.10f<br />', $k/100000);
    13. ?>
    Во-первых, оба цикла сработают 50 000 раз, а не 100 000.

    Второе. Оба теста запускал опять же так, как как и выложил? За один прогон оба цикла?
     
  4. zzzVolkzzz

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

    С нами с:
    10 апр 2009
    Сообщения:
    26
    Симпатии:
    0
    За один прогон я пробывал и пароми по 2 и все 4 теста.
    А что такое PDO, кинте пож ссылку чтоб знать куда копать.
    Пропробывал поменять местами тесты, получилось:
    PHP:
    1.  
    2. for1:  0.18495
    3. row1: 0.52688
    4. row2: 0.0000081297
    5. for2:   0.0000120527
    6.  
    Т.е. ничего не изменилось...

    А почему тест прогониться только 50 000???[/code]
     
  5. zzzVolkzzz

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

    С нами с:
    10 апр 2009
    Сообщения:
    26
    Симпатии:
    0
    Господа, прошу прощение, вся фишка была в скрипте((( Я забыл обнулить константу времени после второго цикла, вот и получилось что средняя скорость запроса: (предыдущая + сумма 100 000 нового теста)/100 000(((

    вот новый код
    PHP:
    1.  
    2. <?php
    3.  for ($i = 0, $k = 0/* раньше здесь $k не было */; $i < 100000; $i++) {
    4.      $k += test_row2($res);
    5.      $i++;
    6.  }
    7.  printf('row2: %.10f<br />', $k/100000);
    8.  
    9.  for ($i = 0,$k = 0/* раньше здесь $k не было */; $i < 100000; $i++) {
    10.      $k += test_for2($res);
    11.      $i++;
    12.  }
    13.  printf('for2:&nbsp&nbsp %.10f<br />', $k/100000);
    14. ?>
    15.  
    результат:

    Код (Text):
    1.  
    2. for1: 0.20168
    3. row1: 0.54892
    4. for2: 0.0000046696
    5. row2: 0.0000071406
    А насчет ссылки про PDO я бы не отказался! )))
     
  6. Ti

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

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    ссылка
     
  7. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    к чему и вёл…

    PHP:
    1. <?php
    2. for ($i = 0; $i < 100000; $i++) {  // при проходе увеличиваем $i
    3. // функция
    4.      $i++;  // ещё раз увеличиваем
    5.   }
    6. ?>
    таким образом в цикле получается $i += 2; и проходов не 100 000, а 50 000
     
  8. zzzVolkzzz

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

    С нами с:
    10 апр 2009
    Сообщения:
    26
    Симпатии:
    0
    Мда, паскаль редко да метко дает о себе знать))))
     
  9. kas1e

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

    С нами с:
    6 апр 2009
    Сообщения:
    280
    Симпатии:
    0
    PHP:
    1. <?php
    2. for ($i = 0; $i < 100000; $i+=2) {  // при проходе увеличиваем $i
    3. // функция
    4. }
    5. ?>
    не вариант?
     
  10. zzzVolkzzz

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

    С нами с:
    10 апр 2009
    Сообщения:
    26
    Симпатии:
    0
    Вариант, только это просто не надо) Я когда писал скрипт сдуру 2 раза инкрементировал, а надо только 1 раз.