За последние 24 часа нас посетили 22954 программиста и 1212 роботов. Сейчас ищут 684 программиста ...

Код для highload

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

  1. Psih

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

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    [vs]
    Настраивать под свой тип нагрузки - тюнить буфера и некоторые другие настроки innodb
     
  2. 440Hz

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

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

    =)
     
  3. Amian

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

    С нами с:
    15 мар 2007
    Сообщения:
    189
    Симпатии:
    0
    Кто-нибудь использует какую-либо имплементацию Berkeley DB помимо SQL и в каких случаях? Авторизация/логин ? Еще что-нибудь ?
     
  4. EvelRus

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

    С нами с:
    16 ноя 2006
    Сообщения:
    2.168
    Симпатии:
    0
    Адрес:
    Москва
    а че за хрень с попапами?)) Pop-Up ))))
    нажал торренты и ту тже три окна всплыло :(
     
  5. Psih

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

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Nemo
    Много накликал слишком. Там один попап только и раз в сутки, реклама :)
     
  6. botton

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

    С нами с:
    9 окт 2008
    Сообщения:
    31
    Симпатии:
    0
    Адрес:
    Камчатский край
    Доброго времени суток всем.
    Меня всегда мучал такой вопрос - о целесообразности использования классов. У меня сложилось такое впечатление, что их использование существенно увеличивает время генерации страницы по сравнению с обычным "карявым" методом. Так оно или кажется?

    Особено это проявляется в cms'ках, когда при генерации страницы скажем с документами, в том числе и подругажаются все классы из конфигурации. Пусть они большинство ихне выполняется, но в целом же в кода они присутствуют, значит ли это что под них выделяются системные ресурсы?
     
  7. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Это фигня. Целесообразно даже юзать фреймворки, вешающие к скрипту еще пару мегабайт =)
     
  8. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    botton
    Все зависит от архитектуры приложения. Обычно подгружается только то, что нужно. В архитектуре MVC в простом сайте подгружается порядка 5-8 классов. Сама специфика этой архитектуры, вроде бы, подразумевает тот факт, что данные в циклах будут перебираться по несколько раз. Безусловно, это увеличивает время выполнения приложения. Но лучше потратить 500$, чтобы увеличить мощность сервера для MVC, чем нанимать на 3 месяца программиста за 2000$/месяц, чтобы тот выполнил ТЗ, которое на MVC мог бы выполнить зи 1 месяц.

    Узким местом является БД. Практически все CMS грешат этим -- они делают по 50 запросов на простейшую страницу, отсюда и время выполнения порядка 1 секунды. И это независимо от того, написаны ли они на классах или нет. Взять, к примеру, phpNuke :)

    Просто когда разрабатываешь, нужно думать головой, оценивать код на рациональность и возможность доработки.
     
  9. freeneutron

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

    С нами с:
    11 июн 2009
    Сообщения:
    226
    Симпатии:
    3
    Недавно проверил скорость функций: array_intersect и array_diff, и удивился, как медленно они работают в отличии от других языков. Например в "Матиматике" аналогичные функции работают в 100 раз быстрее. Я засекал время за которое php выполняет такой вот код:
    PHP:
    1. for($i=0;$i<100;$i++)
    2.     $b1=array_intersect($b[0],$b[$i]);
    , где $b[$i] - массив длинны 1000, наполненный случайными целыми числами из диапазона от 0 до 1000. В среднем у меня этот тест выполняется 10 секунд.
    Придумал аналог для array_intersect:
    PHP:
    1. function intersect($a1, $a2)
    2. {
    3.     $a2=array_flip($a2);
    4.     $a3=array();
    5.     foreach($a1 as $k)if($a2[$k]!==null)$a3[]=$k;
    6.     return $a3;
    7. }
    , который дает 40% экономии времени. Это конечно не впечатляет, но говорит о кривости array_intersect.
    Думаю, что если возникнет задача многократного использования array_intersect или array_diff, то лучше будет загнать исходные данные в БД и обработать их запросами, так как драйвера баз данных давно уже оптимизированны переоптимизированны, хотя возможно есть более рациональное решение этой задачи.
     
  10. freeneutron

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

    С нами с:
    11 июн 2009
    Сообщения:
    226
    Симпатии:
    3
    А такая функция
    PHP:
    1. function intersect(&$a1, &$a2)
    2. {
    3.     if($a1===$a2)return($a1);
    4.     $a3=array();
    5.     $b2=current($a2);
    6.     if($b2!==false)foreach($a1 as $b1)
    7.     {
    8.         while($b1>$b2)
    9.         {
    10.             $b2=next($a2);
    11.             if($b2===false)break(2);
    12.         }
    13.         if($b2==$b1)$a3[]=$b1;
    14.     }
    15.     return $a3;
    16. }
    работает в 10 раз быстрее стандартной array_intersect, при условии, что исходные массивы уже отсортированы по возрастанию. Большего ускорения средствами PHP врядли можно достичь, но до теоритического предела еше далеко.
     
  11. freeneutron

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

    С нами с:
    11 июн 2009
    Сообщения:
    226
    Симпатии:
    3
    Недавно обнаружил такое дело. Время выполнения некоторых операций PHP, при применении их к массивам, пропорционально зависит от количества элементов данного массива, при чем в некоторых случаях такая зависимость не имеет логичного основания и может быть устранена путем обертывания массива в объект, что позволяет иногда сэкономить кучу машинного времени. Подобное поведение я обнаружил для двух (или трех, как посмотреть) операций: ==, === и global.
    Пусть мы имеем:
    Код (Text):
    1. $a=range(0,1e5);        //большой массив
    2. class wrap{     //Класс обертка
    3.     public $a;
    4.     public function __construct($a){
    5.         $this->a=$a;
    6.     }
    7. }
    8. $w=new wrap($a);        //Обернутый массив
    Теперь, при выполнении кода:
    Код (Text):
    1. $b=$a;$b===$a;      //Иногда такое имеет практический смысл
    PHP сравнит каждый элемент массива с самим собой, а в таком случае:
    Код (Text):
    1. $x=$w;$x===$w;
    PHP сразу поймет, что сравниваемые переменные идентичны.
    Теперь, при выполнении кода:
    Код (Text):
    1. function f(){
    2.     global $a;
    3.     count($a);
    4. }
    PHP потратит примерно столько же времени, как для
    Код (Text):
    1. function f(){
    2.     $a=range(0,1e5);
    3.     count($a);
    4. }
    То есть, произойдет бессмысленный перебор всех элементов массива. Если воспользоваться оберткой:
    Код (Text):
    1. function f(){
    2.     global $w;
    3.     $a=$w->a;
    4.     count($a);
    5. }
    То по времени это будет аналогично такому
    Код (Text):
    1. function f(){
    2.     $a=$GLOBALS['a'];
    3.     count($a);
    4. }
    Как я уже говорил, все дело в зависимости времени исполнения от размера массива. И по всей видимости это является артефактом старых версий PHP.
     
  12. VItalijs

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

    С нами с:
    17 дек 2008
    Сообщения:
    244
    Симпатии:
    0
    Адрес:
    Рига, Латвия
    переменная $b становится копией массива $a.

    здесь же $x и $w ссылаются на 1 и тот же объект, очевидно что сравнить ссылке быстрее, если там был бы clone $w тест был бы более логичен, ну или $b = &$a.

    Но вообщем-то в highload наврятли это было бы узким местом.
     
  13. freeneutron

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

    С нами с:
    11 июн 2009
    Сообщения:
    226
    Симпатии:
    3
    VItalijs
    $b = &$a и $b = $a аналогичны по сути до тех пор, пока $b и $a остаются неизменными
     
  14. 440Hz

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

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    ага. мы увеличили произв. примерно в 1000 раз перейдя с foreach на while. плюс кеширование данных в наследуемых объектах. у нас очень большие массивы объектов.
    =)
     
  15. VItalijs

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

    С нами с:
    17 дек 2008
    Сообщения:
    244
    Симпатии:
    0
    Адрес:
    Рига, Латвия
    С highload я не работал никогда, пока что, это было лишь предположение.

    foreach вреале медленнее, тут где-то даже тесты были. В нашем проекте, когда начинали писать, начали юзать везде while, но так как не highload и не будет никогда, продолжил писать foreach, а то я всегда ресетить массив забываю.

    Но что бы в 1000 раз, блин, это на самом деле очень большие массивы =)

    ну нет, хранить ссылку и скопировать целиком объект(массив), не одно и тоже. надо бы затестить =\
     
  16. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    А как дальше данные обрабатываются?
    Разве while (list($bla) = $bla2) или while ($bla = each($bla2)) быстрее foreach ($bla2 as $bla) ?
     
  17. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Kreker
    К сожалению, в PHP foreach работает совсем не так, как for или while.
    foreach сначала снимает полную копию исходного массива (медленно), и только потом начинает по ней циклить.
    Не понимаю, зачем разработчики сделали такую засаду. Наверняка можно было реализовать быстрее.
     
  18. admyx

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

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    Dagdamor
    В foreach по ссылке в случае необходимости не передашь разве?
     
  19. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Функция list тут главный тормоз.
    Вообще можно делать так
    PHP:
    1. <?
    2. foreach ($arr as $k=>&$v) {
    3.    
    и при изменении $v будет меняться элемент в массиве $arr. Этого нельзя сделат в цикле с each.
    Еще foreach не смещает внутренний указатель массива. Короче, сплошные плюсы.
     
  20. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    admyx
    По ссылке в foreach можно передать только третий аргумент - foreach($a as $b=>&$c), но не первый и не второй. Я говорил о первом аргументе, об исходном массиве - из-за его копирования-то и происходят тормоза и трата памяти.

    Может, в будущих версиях этот косяк исправят. Или сделают настройку - возможность итерирования по массиву напрямую, без создания копий, для тех, кому они нафиг не нужны (мне, например. :)) А те, кто боится поломать свой старый код, эту настройку у себя не трогают.
     
  21. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
  22. admyx

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

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    Dagdamor
    Дык о чем я и спрашиваю.
    Херово, что нельзя.
    А я что-то не понимаю - зачем передавать по ссылке третий аргумент? о_0
    По феншую?
     
  23. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    [vs]
    Я у себя потестю этот код :)
    Может, 440Гц как-то иначе делал, без each, например, пользовался не-ассоциативными массивами...
     
  24. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    admyx
    Чтобы внутри цикла, если надо изменить значение массива, писать $c=12345; а не $a[$b]=12345;
    К слову, если пользуетесь вторым вариантом (с &), то сразу после цикла желательно писать unset($c); иначе эта переменная так и пойдет далее по коду как референс. И обычным способом проинициализировать ее не выйдет:

    PHP:
    1. <?php
    2. foreach($a as $b=>&$c) {
    3.   ... // какой-то код
    4. }
    5. ...
    6. $c=0; // кажется, что инициализация переменной, на самом деле в последний элемент $a запишется 0 >:O
    UPD: Тег "php" за три года так и не поправили :D
     
  25. admyx

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

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    Dagdamor
    Спасибо, учту.
    Но я всегда пишу $a[$key] = $value;