За последние 24 часа нас посетили 22530 программистов и 1017 роботов. Сейчас ищут 718 программистов ...

Кружок любопытных извращенцев :)

Тема в разделе "Прочие вопросы по PHP", создана пользователем Psih, 9 июн 2009.

  1. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Неа, я менял местами циклы - всё одно, статика быстрее. И наследование методов работает быстрее объявления.
     
  2. sorteros

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

    С нами с:
    28 авг 2009
    Сообщения:
    54
    Симпатии:
    0
    Возраждаем тему)
    Навеяно вот этим http://www.php.ru/forum/viewtopic.php?t=21449

    Решил проверить, какой способ наиболее быстр. Искать будем тут:

    PHP:
    1.  
    2. <?
    3. $text = 'Диапазон целых чисел (integer) в PHP зависит от платформы (обычно это диапазон 32-битных знаковых целых чисел, то есть от −2 147 483 648 до 2 147 483 647). Числа можно задавать в десятичной, восьмеричной и шестнадцатеричной системах счисления. Диапазон вещественных чисел (double) также зависит от платформы (для 32-битной архитектуры диапазон позволяет оперировать числами от ±1.7×10-308 до ±1.7×10+308). PHP предоставляет разработчикам логический тип (boolean), способный принимать только два значения TRUE («истина») и FALSE («ложь»). При преобразовании в логический тип число 0, пустая строка, ноль в строке «0», NULL и пустой массив считаются FALSE. Все остальные значения автоматически преобразуются в TRUE. Специальный тип NULL предназначен для переменных без определённого значения. Единственным значением данного типа является константа NULL. Тип NULL принимают неинициализированные переменные, переменные инициализированные константой NULL, а также переменные, удалённые при помощи конструкции unset(). Ссылки на внешние ресурсы имеют тип «ресурс» (resource). Переменные данного типа, как правило, представляют собой дескриптор, позволяющий управлять внешними объектами, такими как файлы, динамические изображения, результирующие таблицы базы данных и т. п. Массивы (array) поддерживают числовые и строковые ключи и являются гетерогенными. Массивы могут содержать значения любых типов, включая другие массивы. Порядок элементов и их ключей сохраняется.';
    4. ?>
    5.  
    Способ 1. Регулярные выражения.

    PHP:
    1.  
    2. <?
    3. for($i=0;$i<8000;$i++)
    4. {      
    5.   preg_match_all("#\d#", $text, $m);
    6.   $nums = implode('', $m[0]);
    7. }
    8. ?>
    9.  
    Код (Text):
    1.  
    2. 7.38235497475
    3. 7.4467279911
    4. 7.19334411621

    Остальные способы - простой перебор в цикле с различными условиями.

    Способ 2.

    PHP:
    1. <?
    2. for($i=0;$i<8000;$i++)
    3. {
    4.   $nums = '';
    5.   for($j = 0, $length = strlen($text); $j < $length; $j++)
    6.   {
    7.     if($text[$j] == 0 ||
    8.        $text[$j] == 1 ||
    9.        $text[$j] == 2 ||
    10.        $text[$j] == 3 ||
    11.        $text[$j] == 4 ||
    12.        $text[$j] == 5 ||
    13.        $text[$j] == 6 ||
    14.        $text[$j] == 7 ||
    15.        $text[$j] == 8 ||
    16.        $text[$j] == 9)    
    17.       $nums .= $text[$j];
    18.   }
    19. }
    20. ?>
    Код (Text):
    1.  
    2. 16.2349131107
    3. 17.1354785147
    4. 16.4527785241

    Способ 3.

    PHP:
    1. <?
    2. for($i=0;$i<8000;$i++)
    3. {
    4.   $nums = '';
    5.   for($j = 0, $length = strlen($text); $j < $length; $j++)
    6.   {
    7.     if(is_numeric($text[$j]))    
    8.       $nums .= $text[$j];
    9.   }
    10. }
    11. ?>
    Код (Text):
    1.  
    2. 17.8225140572
    3. 17.9709398746
    4. 18.8869121075

    Способ 4. Вариант с массивом ожидаемо оказывается самым тупым.

    PHP:
    1. <?
    2. for($i=0;$i<8000;$i++)
    3. {
    4.   $nums = '';
    5.   $ar = Array("1", "2", "3", "4", "5", "6", "7", "8", "9", "0");
    6.   for($j = 0, $length = strlen($text); $j < $length; $j++)
    7.   {
    8.     if(in_array($text[$j], $ar))    
    9.       $nums .= $text[$j];  
    10.   }
    11. }
    12. ?>
    Код (Text):
    1.  
    2. 34.7916491032
    3. 36.6915969849
    4. 34.7056632042
    Способ 5. А вот вариант с его индексами оказывается наиболее приближенным к регуляркам.

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

    PHP:
    1. <?
    2. for($i=0;$i<8000;$i++)
    3. {
    4.   $nums = '';
    5.   $ar = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1);
    6.   for($j = 0, $length = strlen($text); $j < $length; $j++)
    7.   {
    8.     if(isset($ar[$text[$j]]))    
    9.       $nums .= $text[$j];
    10.   }  
    11. }
    12. ?>
    Код (Text):
    1.  
    2. 7.44147801399
    3. 7.60429906845
    4. 7.7537958622
    Итог. Регулярные выражения оказались наиболее быстрым способом "вытаскивания" цифр из строки.
    Итог для меня довольно неожидан.

    ps. Если кто надумает, предлагайте свои способы, я наверняка что-то упустил;)
     
  3. kostyl

    kostyl Guest

    sorteros
    ты точно извращенец...
     
  4. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    sorteros
    Можешь даже не тестировать.

    Регулярки быстрее во всех нетривиальных обработках текста.

    Исключение только для простейших операций вроде нахождения строки или подстроки.
     
  5. topas

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

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Вы чего? регулярные выражения в этой тривиальной задаче совершенно не при чем. Выйгрыш они дают исключительно из-за того, что представляют из себя одну функцию написанную на Си, а не цикл на php

    Код (Text):
    1.  
    2. Регулярные выражения 0.1 сек
    3. Способ 2             3.8 сек
    4. Способ 5             0.47 сек
    5.  
    6. ...
    7.  
    8. Функция на Си:       0.008 сек
     
  6. Jensi

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

    С нами с:
    9 апр 2009
    Сообщения:
    299
    Симпатии:
    0
    Проверка скорости циклов (while, do...while, for, foreach)
    Что-то у меня такое получилось о_О:
    PHP:
    1. <?
    2. $i=0;
    3. $a=0;
    4. $arr = array("0","1","2","3","4","5","6","7","8","9","10");
    5.  
    6.  
    7. timer();
    8. while($i<=10)
    9. {
    10.     echo"$i";
    11.     $i++;
    12. }
    13. echo ' <br>While: '.timer().' sec <br><br>';
    14.  
    15.  
    16. timer();
    17. do
    18. {
    19.     echo"$a";
    20.     $a++;
    21. }
    22. while($a<=10);
    23. echo ' <br>Do...while: '.timer().' sec <br><br>';
    24.  
    25.  
    26. timer();
    27. for($a=0;$a<=10;$a++){
    28.     echo"$a";
    29. }
    30. echo ' <br>FOR: '.timer().' sec <br><br>';
    31.  
    32.  
    33. timer();
    34. foreach($arr as $key => $value)
    35. {
    36.  echo"$key";   
    37. }
    38. echo ' <br>Foreach: '.timer().' sec <br><br>';
    39.  
    40. ?>

    Код (Text):
    1. While: 4.399999 sec
    2. Do...while: 2.299999 sec
    3. FOR: 2.299999 sec
    4. Foreach: 2.599999 sec
    5.  
    6. While: 4.200000 sec
    7. Do...while: 2.400000 sec
    8. FOR: 2.299999 sec
    9. Foreach: 2.699999 sec
    10.  
    11. While: 4.300000 sec
    12. Do...while: 3.199999 sec
    13. FOR: 2.599999 sec
    14. Foreach: 2.900000 sec
    15.  
    16. While: 4.499999 sec
    17. Do...while: 2.399999 sec
    18. FOR: 2.399999 sec
    19. Foreach: 2.599999 sec
    Как более правильно проверять скорость работы функций?
     
  7. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    интересные отличия
     
  8. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Омг, господи... Может не стоит заниматся таким тестированием вовсе?
    Что проверялось то?
    Скорость вывода цифр? или что?

    Код (Text):
    1. While: 0.34265089035034 sec
    2. Do...while: 0.51998710632324 sec
    3. FOR: 3.0228791236877 sec
    4. Foreach: 2.1040971279144 sec
    то же самое в консоли

    Код (Text):
    1. While: 0.16053700447083 sec <br><br> <br>Do...while: 0.19756603240967 sec <br><br> <br>FOR: 0.90979814529419 sec <br><br> <br>Foreach: 0.99230909347534 sec <br><br>
    PHP:
    1. <?php
    2. $i=0;
    3. $a=0;
    4. $arr = array("0","1","2","3","4","5","6","7","8","9","10");
    5. define('CYCLES', 1000000);
    6.  
    7. $start = microtime(true);
    8. for($k = 0; $k<CYCLES; $k++)
    9. while($i<=10)
    10. {
    11.     $i++;
    12. }
    13. $end =  microtime(true);
    14. echo ' <br>While: ' . ($end - $start) . ' sec <br><br>';
    15.  
    16.  
    17. $start = microtime(true);
    18. for($k = 0; $k<CYCLES; $k++)
    19. do
    20. {
    21.     $a++;
    22. }
    23. while($a<=10);
    24. $end =  microtime(true);                    
    25. echo ' <br>Do...while: ' . ($end - $start) . ' sec <br><br>';
    26.  
    27.  
    28. $start = microtime(true);
    29. for($k = 0; $k<CYCLES; $k++)
    30. for($a=0;$a<=10;$a++){
    31. }
    32. $end =  microtime(true);
    33. echo ' <br>FOR: '. ($end - $start) .' sec <br><br>';
    34.  
    35.  
    36. $start = microtime(true);
    37. for($k = 0; $k<CYCLES; $k++)
    38. foreach($arr as $key => $value)
    39. {
    40. }
    41. $end =  microtime(true);
    42. echo ' <br>Foreach: '. ($end - $start) .' sec <br><br>';
     
  9. Щербаков Олег

    Щербаков Олег Активный пользователь

    С нами с:
    30 ноя 2008
    Сообщения:
    19
    Симпатии:
    0
    Здравствуйте, очень интересует Ваше общее мнение по нескольким вопросам. Самому проверить в данный момент пока нет времени(и опыта) но может для кого то это очевидно и он меня просветит))
    1. Что выгоднее по быстродействию и/или памяти - использования global для доступа к переменным вне функций и методов или использование метода синглтона класса-хранилища, как это реализовано, например, в зендфреймворке?
    2. Что выгоднее с точки зрения быстродействия - создать класс и таскать его за собой по системе используя его набор методов как инструмент или создавать экземпляр объекта для каждой отдельной сущности? На примере класса формы - у него есть метод проверить значения и восстановить, например, из пост параметров (возможно еще отфильтровать) и нужно спроектировать его работу.
    Вариант первый: он будет съедать массив полей и параметров извне и возвращать какой то код/валидность/выполнять отправку/делать запись и будет существовать грубо говоря в одном экземпляре.
    Вариант второй: для каждой формы создавать новый объект который будет наполняться абстрактными данными (создать поле text, создать поле textarea) и отвечать так же абстрактно.
    3. И вопрос на засыпку: для создания объекта насколько мне известно нужно довольно много ресурсов, особенно если речь идет от классе с большим количеством кода - нужно инициализировать всего его члены и методы. Каким образом интерпретатор php тиражирует классы - для каждого экземпляра заново инициализирует все методы и члены или как то более быстро делает объект просто "таким же"?
    Иначе говоря php сложнее всего инициализирует класс или каждый новый объект этого класса дается ему так же тяжко и, если $obj1 и $obj2 два объекта одного класса, то $obj->method() и $obj2->method() - это две разных "функции" и каждая имеет свое место в памяти?
    Буду очень благодарен развернутому ответу с объяснениями и примерами, так как это мне бы это помогло съэкономить просто тонну времени ))
     
  10. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    1. как тебе удобнее в профессиональном смысле.
    2. с точки зрения быстродействия не важно - важно с точки зрения удобства.
    3. ты не там ищешь экономию.

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

    во вторых - высоконагруженные приложения строятся совсем по другим меркам, вернее они не зависят от железа. мало мощности? втыкается еще одна железяка и все. код не меняется.

    в третьих - оптимизировать надо тогда - когда тормозит, а ловля блох - кому она нах нужна?
     
  11. Щербаков Олег

    Щербаков Олег Активный пользователь

    С нами с:
    30 ноя 2008
    Сообщения:
    19
    Симпатии:
    0
    спасибо! такой ответ мне очень важен тем что подтверждает мою точку зрения - объектно ориентированный подход это удобство за цену равную копейкам производительности в худшем случае.
     
  12. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    вот тут я бы посоветовал искать середину, т.к. в ООП можно такого нагородить - монстр получится. ООП это очень тонкий инструмент и пользоваться им надо там, где он нужен а не радии ООП.

    вообще - задача выбирает инструменты а не наоборот. очень бы хотелось донести именно этот момент до всех.
     
  13. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    предлагаю сделать мини-бар по рекламным, с "советом дня"
     
  14. Щербаков Олег

    Щербаков Олег Активный пользователь

    С нами с:
    30 ноя 2008
    Сообщения:
    19
    Симпатии:
    0
    Чтобы не быть голословным выбрал время и провел несколько замеров.
    Результаты примерно такие
    1. global в 5-7 быстрее цепляет данные, думаю из за 2х промежуточных методов (getInstance(), get()) и проверок на существование в каждом из них.
    2. создания объектов в цикле (10000 итераций, зависимость от кол-ва этих итераций во всех случаях получалась линейная)
    создание обыкновенных массивов
    PHP:
    1.  
    2. for ($i = 0; $i < 10000; $i++)
    3. {
    4.    $arr[] = array(1);
    5. }
    6. time: 0.00724411010742
    7. memory: 2386136
    8.  
    создание стандартных классов (взял встроенный ArrayObject)
    PHP:
    1.  
    2. for ($i = 0; $i < 10000; $i++)
    3. {
    4.    $arr[] = new ArrayObject();
    5. }
    6. time: 0.0210390090942
    7. memory: 4034856
    8.  
    создания класса (код класса ~1000 строк кода, но, думаю, не суть)
    PHP:
    1.  
    2. for ($i = 0; $i < 10000; $i++)
    3. {
    4.    $arr[] = new MyObj();
    5. }
    6. time: 0.033038854599
    7. memory: 9474832
    8.  
    Для себя сделал примерно такой вывод - не так страшен черт как его малюют )) Ожидал увидеть разницу в порядках (10-100 раз).
    Для сравнения - на подключения файла с этим классом потребовалось
    PHP:
    1.  
    2. require_once('MyObj.php');
    3. time: 0.00677990913391
    4. memory: 455840
    5.  
    (грубо говоря по времени как создать 10000 массивов и памяти как на 10000 ArrayObject)
    Разница в ресурсах на создание ArrayObject и MyObj - для меня главный аргумент в защиту ООП как подхода. Пускай это ресурсозатратно, зато расширение функциональности уже не влечет за собой каких то скачков.
    А по поводу использования ОПП согласен на 100%, хотя нагородить монстра используя процедурных подход имхо гораздо проще. Естественно, речь идет о какой-нибудь системе а-ля новый движок сайта (читай очередной велосипед) с которой имеют дело более 1 человека.[/php]
     
  15. iliavlad

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

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    осталось только найти задачу, где надо в цикле 10000 объектов создавать.
     
  16. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    Щербаков Олег
    осталось допереть, что не надо зря тратить время на всякую фигню
     
  17. Щербаков Олег

    Щербаков Олег Активный пользователь

    С нами с:
    30 ноя 2008
    Сообщения:
    19
    Симпатии:
    0
    +1 к последнему посту))
     
  18. vuzy

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

    С нами с:
    11 мар 2010
    Сообщения:
    199
    Симпатии:
    0
    Адрес:
    киев
    Здравствуйте господа извращенцы? Возьмете меня в свой клуб?
    Я тут почитал ваши тесты на производительность и наткнулся на сообщение:
    так вот во мне заиграло любопытство... что быстрее заработает вывод всех 10к записей по 1 запросу Mysql
    или 10к выводов десяти тысяч записей по очереди...

    UPD:

    Провел первый тест - добавление 10к запросов в базу данных потратил 0.343271 времени...
    код простой
    PHP:
    1. <?
    2. require_once('bd.php');
    3. $time_0=microtime();
    4. for ($i=0; $i<10000; $i++)
    5. {
    6. $sql="Insert into test (name) VALUES ('1')";
    7. }
    8. $time_1=microtime();
    9. $time_process=$time_1-$time_0;
    10. echo $time_process;
    11. ?>
     
  19. vuzy

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

    С нами с:
    11 мар 2010
    Сообщения:
    199
    Симпатии:
    0
    Адрес:
    киев
    далее модифицировал скрипт и провел тест на вывод 10к запросов из базы данных каждый раз выбирая данные из БД
    потратил вот сколько времени : 0.167259 кажется что в первом случае времени потратил гараздо больше но вот кода там меньше.
    на всякий случай код:
    PHP:
    1. <?
    2. require_once('bd.php');
    3. $time_0=microtime();
    4. for ($i=0; $i<=10000; $i++)
    5. {
    6. $sql="select * From test limit 1";
    7. $sql=mysql_query($sql);
    8. $sql=mysql_fetch_row($sql);
    9. echo $sql[1]."<br>";
    10. }
    11. $time_1=microtime();
    12. $time_process=$time_1-$time_0;
    13. echo $time_process;
    14. ?>
     
  20. vuzy

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

    С нами с:
    11 мар 2010
    Сообщения:
    199
    Симпатии:
    0
    Адрес:
    киев
    и на последок вывод 10к строк по одному запросу дал следующий неоднозначный результат:
    0.106475
    0.304437
    0.140644
    0.075494
    0.103298

    в среднем получается
    10к раз ->0.167259
    вывод -> 0.146069
    ввод -> 0.343271

    код следующий:

    PHP:
    1. <?
    2. require_once('bd.php');
    3. $time_0=microtime();
    4. $sql="SELECT id, name FROM test";
    5. $zql=mysql_query($sql);
    6. WHILE ($xql=mysql_fetch_row($zql))
    7. {
    8. echo $xql[1].$xql[0];
    9. }
    10. $time_1=microtime();
    11. $time_process=$time_1-$time_0;
    12. echo $time_process;
    13. ?>

    В заключение скажу что количество запросов или обьем выводимой информации мало как влияет на быстродействие. Вконце концов 10000 раз повториить запрос довольно трудоемко так же как за 1 раз вывести 10к строк. Это так же лишний раз доказывает что от переставновки мест слогаемых сумма не меняется.
     
  21. А тебя не смущает, что ты в первом тесте выбираешь 10к раз одну и ту же первую строчку, а во втором - 10к разных?
     
  22. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Вопросы:
    Правда ли что один запрос на много значений, быстрее чем много запросов на одно значение?
    Сильно ли влияет limit на скорость запроса?
    Результаты:
    Итоги:
    1. Один запрос работает быстрее чем много запросов в цикле (вполне ожидаемо).
    2. Limit ускоряет выполнение запроса (тоже вполне ожидаемо).
    3. Один запрос работает настолько быстрее, что оправдывается дополнительный цикл обработки результата.
    4. PS работает быстрее для вставки. PS работал медленнее для выбора при первом прогоне. При последующих прогонах показал результаты лучше, чем без PS. В "результаты" я скопировал более стабильные данные.
    Да, я в курсе: http://www.php.ru/forum/viewtopic.php?t=24239

    Код:
    Начало:
    Код (PHP):
    1. <style>
    2. * {margin:0px; padding:0px; font-size:100%}
    3. .zag {font-weight:bold; margin-top: 1em;font-size:110%}
    4. </style>
    5. <?php
    6. ini_set("max_execution_time","0");
    7.  
    8. $link=mysql_connect("localhost", "u", "p");
    9. $temp=mysql_select_db("test");
    10. mysql_query("set names utf8");            
    Все действия с базой разбиты на функции. Вызываются функции так:
    Код (PHP):
    1. ?>
    2. <p class='zag'>Вставка в цикле (10000 значений)</p>
    3. <?php
    4. $arrTime=array();
    5. for ($j=0;$j<5;$j++){
    6.     $time=microtime(1);
    7.     insert();
    8.     $timeI=(microtime(1)-$time);
    9.     $arrTime[]=$timeI;
    10.     echo $timeI,"<br />";
    11.     clear();
    12. }
    13. echo "<b>Среднее</b> ",array_sum($arrTime)/count($arrTime),"<br />";
    Сами функции:
    Код (PHP):
    1. <?php
    2. function insert(){
    3.     for ($i=0; $i<=10000; $i++){
    4.         $sql="insert into t(num) values($i) ";
    5.         mysql_query($sql);
    6.     }
    7. }
    8.  
    9. function insertOneQuery(){
    10.     $sql="insert into t(num) values(0) ";
    11.     for ($i=1; $i<=10000; $i++){
    12.         $sql .= ", ($i)";
    13.     }
    14.     mysql_query($sql);
    15. }
    16.  
    17. function select(){
    18.     for ($i=0; $i<=1000; $i++){
    19.         $sql="select num from t where num=$i";
    20.         $res=mysql_query($sql);
    21.         $row=mysql_fetch_row($res);
    22.         $k=$row[0];
    23.     }
    24. }
    25.  
    26. function selectOneQuery(){
    27.     $sql="select num from t where num in (0";
    28.     for ($i=1; $i<=1000; $i++){
    29.         $sql .= ", $i";
    30.     }
    31.     $sql .= ")";
    32.     $res=mysql_query($sql);
    33.     while($row=mysql_fetch_row($res)){
    34.         $k=$row[0];
    35.     }
    36. }
    37.  
    38. function fullSelect(){
    39.     $sql="select num from t";
    40.     $res=mysql_query($sql);
    41.     while($row=mysql_fetch_row($res)){
    42.         $k=$row[0];
    43.     }
    44. }
    45.  
    46. function select10000(){
    47.     for ($i=0; $i<=10000; $i++){
    48.         $sql="select num from t where num=$i";
    49.         $res=mysql_query($sql);
    50.         $row=mysql_fetch_row($res);
    51.         $k=$row[0];
    52.     }
    53. }
    54.  
    55. function selectOneQuery10000(){
    56.     $sql="select num from t where num in (0";
    57.     for ($i=1; $i<=10000; $i++){
    58.         $sql .= ", $i";
    59.     }
    60.     $sql .= ")";
    61.     $res=mysql_query($sql);
    62.     while($row=mysql_fetch_row($res)){
    63.         $k=$row[0];
    64.     }
    65. }
    66.  
    67. function selectLimit(){
    68.     for ($i=0; $i<=1000; $i++){
    69.         $sql="select num from t where num=$i limit 1";
    70.         $res=mysql_query($sql);
    71.         $row=mysql_fetch_row($res);
    72.         $k=$row[0];
    73.     }
    74. }
    75.  
    76. function selectOneQueryLimit(){
    77.     $sql="select num from t where num in (0";
    78.     for ($i=1; $i<=1000; $i++){
    79.         $sql .= ", $i";
    80.     }
    81.     $sql .= ") limit 1000";
    82.     $res=mysql_query($sql);
    83.     while($row=mysql_fetch_row($res)){
    84.         $k=$row[0];
    85.     }
    86. }
    87.  
    88. function selectLimit10000(){
    89.     for ($i=0; $i<=10000; $i++){
    90.         $sql="select num from t where num=$i limit 1";
    91.         $res=mysql_query($sql);
    92.         $row=mysql_fetch_row($res);
    93.         $k=$row[0];
    94.     }
    95. }
    96.  
    97. function selectOneQueryLimit10000(){
    98.     $sql="select num from t where num in (0";
    99.     for ($i=1; $i<=10000; $i++){
    100.         $sql .= ", $i";
    101.     }
    102.     $sql .= ") limit 10000";
    103.     $res=mysql_query($sql);
    104.     while($row=mysql_fetch_row($res)){
    105.         $k=$row[0];
    106.     }
    107. }
    108.  
    109.  
    110. function clear(){
    111.     mysql_query("delete from t");
    112. }
    113.  
    114. function insertPS(){
    115.     global $db;
    116.     $stmt = $db->prepare("insert into t(num) values(?)");
    117.     $stmt->bind_param("i", $i);
    118.     for ($i=0; $i<=10000; $i++){
    119.         $stmt->execute();
    120.     }
    121. }
    122. function selectPS(){
    123.     global $db;
    124.     $stmt = $db->prepare("select num from t where num=?");
    125.     $stmt->bind_param("i", $i);
    126.     $stmt->bind_result($k);
    127.     for ($i=0; $i<=1000; $i++){
    128.         $stmt->execute();
    129.         $stmt->fetch();
    130.     }
    131. }
    132.  
    133. function select10000PS(){
    134.     global $db;
    135.     $stmt = $db->prepare("select num from t where num=?");
    136.     $stmt->bind_param("i", $i);
    137.     $stmt->bind_result($k);
    138.     for ($i=0; $i<=10000; $i++){
    139.         $stmt->execute();
    140.         $stmt->fetch();
    141.     }
    142. }
    143.  
    144. function selectLimitPS(){
    145.     global $db;
    146.     $stmt = $db->prepare("select num from t where num=? limit 1");
    147.     $stmt->bind_param("i", $i);
    148.     $stmt->bind_result($k);
    149.     for ($i=0; $i<=1000; $i++){
    150.         $stmt->execute();
    151.         $stmt->fetch();
    152.     }
    153. }
    154.  
    155. function selectLimit10000PS(){
    156.     global $db;
    157.     $stmt = $db->prepare("select num from t where num=? limit 1");
    158.     $stmt->bind_param("i", $i);
    159.     $stmt->bind_result($k);
    160.     for ($i=0; $i<=10000; $i++){
    161.         $stmt->execute();
    162.         $stmt->fetch();
    163.     }
    164. }
    165.  
    166. ?>
     
  23. vuzy

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

    С нами с:
    11 мар 2010
    Сообщения:
    199
    Симпатии:
    0
    Адрес:
    киев
    Взял на вооружение сей коментарий и провел следующий эксперемент:
    Модифицировал первый скрипт следующим образом:
    PHP:
    1. <?
    2. require_once('bd.php');
    3. $time_0=microtime();
    4. for ($i=0; $i<=10000; $i++)
    5. {
    6. $sql="select id, name From test where id='".$i."'";
    7. $xql=mysql_query($sql);
    8. $zql=mysql_fetch_row($xql);
    9. echo $zql[1]." ".$zql[0]."<br>";
    10. }
    11. $time_1=microtime();
    12. $time_process=$time_1-$time_0;
    13. echo $time_process;
    14. ?>
    провел несколько тестов. И они показали следующие результаты:
    [sql]
    0.510761
    0.119496
    -0.266093(возьмем за какойнибудь процесс кеширования страницы и не учитываем)
    незнаю каким чудом но они разные вплоть до того что PHP опережает время О_о
    если сравнить с пердыдущими результатами то несильно то они и отличаются.
    (0.510761+0.119496)/2= 0.3151285 > 0.167259
    [/sql]
    Итого полученный результат получается дольше чем в пердыдущем тесте и дольше чем вывести 10к строчек за 1 раз в три раза.
     
  24. Причем, тест у тебя все равно не равноценный. Т.к. у тебя используется поиск, а во втором - нет.
     
  25. vuzy

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

    С нами с:
    11 мар 2010
    Сообщения:
    199
    Симпатии:
    0
    Адрес:
    киев
    непонимаю причем тут поиск в таблице всего 10000 запрсов и все они так или иначе будут выведены одним запросом с поиском или без него. возможно он просто отнимает время на поиск нужного значения в поле Id но присваивать поиск к запросу где он выводит вю таблицу глупо и нерентабельно =)