За последние 24 часа нас посетил 49841 программист и 1757 роботов. Сейчас ищут 844 программиста ...

Опыт

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

  1. Hight

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

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    Получается, что пишем код как попало, делаем узкие места где попало, а потом оптимизируем код, который был написан как попало, в котором где попало можно найти узкие места. Непорядок товарищи! Наша власть будет с этим бороться, любыми методами. Ура Ура Ура... :lol:
     
  2. Петр

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

    С нами с:
    20 мар 2006
    Сообщения:
    1.253
    Симпатии:
    0
    Адрес:
    Центр Вселенной
    Hight, а ведь так обычно и получается.
    И не мы все неправильные программисты, а от нас хотят быстрее.
     
  3. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    [​IMG]
     
  4. host

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

    С нами с:
    20 июн 2007
    Сообщения:
    733
    Симпатии:
    3
    Петр
    А как же тогда показать все записи из бд? Я делал так:
    PHP:
    1. <?php
    2. $rows = mysql_num_rows($query);
    3. for($i=0; $i<$rows; $i++)
    4. {
    5. $mass = mysql_fetch_array($query);
    6. echo $mass['field'];
    7. }
    8. ?>
    Если же mysql_fetch_array() вынести за пределы цикла, то уже не будут выведены поля
    Скажи пожалуйста, как ты избегаешь запросов в цикле и при этом сохраняешь саму суть
     
  5. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    PHP:
    1. while (($row = mysql_fetch_array()) !== false) {
     
  6. Петр

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

    С нами с:
    20 мар 2006
    Сообщения:
    1.253
    Симпатии:
    0
    Адрес:
    Центр Вселенной
    host, это не запрос в цикле, это обработка результатов запроса.
    запрос в цикле вот:
    PHP:
    1.  
    2. <?
    3. while (1) $r = mysql_query("select ...");
    4. ?>
    5.  
     
  7. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Psih
    Чем специфичны мои случаи? :)
     
  8. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Sergey89
    Твой? Тем, что это тест и в реальности такие регулярки просто не используют. Не имею привычки простейшие вещи, которые легко реализуються str* функциями писать на регулярках, ибо медленее. Регулярки используются для валидации e-mail'a к примеру или для обработки BBCode (и то, большую часть я обрабатываю str_replace'om, а то что он не в силах сделать, делаю уже регуляркой - к примеру [a]http://[/a] и [a=http://]some text[/a]) - вообщем для более-менее сложных вещей, где использование str функций или гемморно да и неоправдано бо есть регулярки :)
     
  9. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Я думаю что первый будет быстрее всего :)
     
  10. Anonymous

    Anonymous Guest

    А. Что спорите, все равно в php6 POSIX уже не будет.

    Напоминает тот тест на Apple.com — там где Safari быстрее всех. Ага. Просто onload генерирует раньше, чем страница догрузится...

    Эт я к тому, что при желании, тестами можно доказать что угодно ^_^
     
  11. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Горбунов Олег
    Ну с последним я бы не согласился. Была взята реальная задача и решена двумя разными инструментами. Результат выше есть. Я думаю в данном случае доказать что POSIX всё-же быстрее чем PRCE не удасца ^_^

    З.Ы. Ты меня заразил этим смайликом.... ^_^
     
  12. AntonShevchuk

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

    С нами с:
    6 июл 2007
    Сообщения:
    27
    Симпатии:
    0
    Адрес:
    Kharkov
    Покажите мне узкое место...

    ...включить дебаг (если есть конечно) для логирования SQL запросов - вот вам и все узкие места, зачастую, оптимизировать надо именно архитектуру, вылизывая код (убирая sizeof из циклов, шаманя с регулярками) вы не добьетесь такого повышения производительности, как если уберете пару лишних обращений к БД...
     
  13. Петр

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

    С нами с:
    20 мар 2006
    Сообщения:
    1.253
    Симпатии:
    0
    Адрес:
    Центр Вселенной
    AntonShevchuk
    Пара лишний обращений это одно.
    А 347 запросов это другое. Сайт не покажу.
     
  14. AntonShevchuk

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

    С нами с:
    6 июл 2007
    Сообщения:
    27
    Симпатии:
    0
    Адрес:
    Kharkov
    С этим не поспоришь, помниться тоже наткнулся разок с приблизительно следующим:
    Задача - вывести инфу о юзерах для странички статистики:

    PHP:
    1.  
    2. <?
    3. // получим список всех id
    4. $arrUsers = $db->queryAll('select id from users');
    5. $arrUsersData = array();
    6. for($i=0;$i<sizeof($arrUsers);$i++){
    7.    // получим инфу о конкретном юзере
    8.    $arrUsersData[] = $db->queryRow("select * from users where id = {$arrUsers[$i]}");
    9. }
    10. ?>
    11.  
    Конечно это упрощенный пример того что было, но достаточно точно иллюстрирует, что если мы оптимизируем код вынеся sizeof из цикла, и переменную из кавычек - то это не даст такого результат в сравнении с избавлением от лишних обращений к БД (от запросов в цикле о которых говорит Петр)
     
  15. Петр

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

    С нами с:
    20 мар 2006
    Сообщения:
    1.253
    Симпатии:
    0
    Адрес:
    Центр Вселенной
    AntonShevchuk
    Если честно, приведенный Вами код - это такой изврат...
    Я надеюсь, Вы его нигде не используете, и что это иллюстрация того, как делать нельзя.
    PHP:
    1.  
    2. $data = array();
    3. $r = mysql_query('select * from `users`');
    4. while ($d = mysql_fetch_*($r)) {
    5.   $data[] = $d;
    6. }
    7.  
     
  16. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    Петр, я надеюсь, вы этот код нигде не используете, и что это иллюстрация того, как делать нельзя.
     
  17. Петр

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

    С нами с:
    20 мар 2006
    Сообщения:
    1.253
    Симпатии:
    0
    Адрес:
    Центр Вселенной
    Ваш вариант, пожалуйста.
     
  18. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    я бы как минимум добавил бы лимиты
     
  19. Петр

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

    С нами с:
    20 мар 2006
    Сообщения:
    1.253
    Симпатии:
    0
    Адрес:
    Центр Вселенной
    dark-demon
    Суть в том, что мои две строчки заменяют те пять и неопределенное количество уходящих запросов.
    А лимиты это что называется докопаться не до чего.
     
  20. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Лимиты, не лимиты... Лимиты можно и не ставить, хотя конечно постраничный вывод куда удобнее.
    Просто пример в корне показывает как не надо делать. К тому-же автор ступил совсем, зачем сперва выбирать id из таблицы users а потом из неё же снова выбирать, только уже ВСЕ поля. Крайне идиотский пример. Смысл он бы имел в таком варианте
    PHP:
    1. <?php
    2.  // получим список всех пользователей
    3.  $arrUsers = $db->queryAll('select * from users');
    4.  $arrUsersData = array();
    5.  for($i=0;$i<sizeof($arrUsers);$i++){
    6.    // получим доолнительную инфу о конкретном юзере
    7.    $arrUsersData[$arrUsers[$i]] = $db->queryRow("select * from users_details where id = ".$arrUsers[$i]);
    8.  }
    9.  ?>
    Что переписываеться примерно так
    PHP:
    1. <?php
    2. $arrUsers = $db->queryAll('SELECT * FROM users LEFT JOIN users_details ON usd_id = usr_id');
    3. for ($i = 0, $cnt = sizeof($arrUser); $i < $cnt; $i++){
    4.     //  Здесь чё-то делаем типа htmlspecialchars и прочее
    5. }
    6. ?>
     
  21. host

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

    С нами с:
    20 июн 2007
    Сообщения:
    733
    Симпатии:
    3
    проверил ради интереса цикл for и foreach Задача их была просто пройтись по всему массиву состоящему из 1000 значенений :)
    Результаты:
    цикл for - 0.70383500
    цикл foreach - 0.39325800

    Получается, что foreach работает в 2 (!) раза бестрее цикла for
     
  22. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    host
    А что в этом странного ? (я удивлён почему так мало, я почему-то был уверен что гараздо больше)
     
  23. Davil

    Davil Guest

    Это все оптимизация SQL запросов. Петруха говорил про оптимизацию кода.
    host
    Это смотря что и как перебирать.
     
  24. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Davil
    И кода тоже - вместо того что бы вызывать 1 + кол-во юзеров запросов вызываеться один запрос и его результат обрабатываеться НАМНОГО быстрее. А вообще, оптимизация кода - это всё вместе, а не отдельно SQL запросы и отдельно циклы. Код он и в африке код. Оптимизировать можно отдельно базу данных накладывая индексы и модифицирую саму базу - код можно даже не менять, а оптимизацияч нехилая получиться.
     
  25. Петр

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

    С нами с:
    20 мар 2006
    Сообщения:
    1.253
    Симпатии:
    0
    Адрес:
    Центр Вселенной
    Psih
    Поддерживаю.
    Методы обработки и методы хранения информации должны быть оптимальными всегда.