Оптимизация php по скорости и памяти

До оптимизации быстродействия php-кода я настоятельно рекомендую сначала оптимизировать http-запросы, уменьшить размер js и css, продумать кэширование темплейтов, оптимизировать запросы БД и только тогда заниматься проверкой кода на производительность. Однако стиль программирования надо выбирать до выполнения самой работы и смотреть на ниже перечисленные пункты с точки зрения безопасности - лучше знать о подводных камнях заранее, чем латать дыры потом.

Плохо

Хорошо Разница
$a="text $b"; $a='text '.$b; 50%
eregi("(ма[a-zа-я]{1,20})",$text); preg_match("/(ма[a-zа-я]{1,20})/im",$text); 76%
$test[a][b]=1; $text['a']['b']=2; 361%
foreach($test as $n)
$it=0; while($it<100000)
254%
while (list($k, $v) = each($test)) foreach($test as $k=>$v) 22%
substr_compare("abcd","ab",0,2) strpos("abcd","ab")===0 22%

Поиск прожорливых мест в памяти можно грубо делать так:

function array_size($arr) {
    ob_start();
    print_r($arr);
    $mem = ob_get_contents();
    ob_end_clean();
    $mem = preg_replace("/\n +/", "", $mem);
    $mem = strlen($mem);
    return $mem;
}

foreach($GLOBALS as $key=>$value){
    $memEstimate = array_size($value);
    echo($key.':'.$memEstimate);
}

Читайте так же:

comments powered by Disqus
  • vectoroc
    avatar
    Давайте писать на асме!
    Если выбранное вами средство не позволяет писать максимально удобно по причине производительности, может вы ошиблись в выборе средства?
    п.с. алгоритмы рулят
  • Я конечно понимаю что надо брать выше и учитывать архитектуру в целом (я об этом даже писал немного http://kurapov.name/article/1347 ), но с точки зрения банального кодинга знать что ereg лучше preg - всегда плюс.
  • "ereg лучше preg"
    наоборот :)
    а иногда можно использовать строковые функции вместо регулярок.
    все зависит от кривости рук программиста
  • vectoroc
    avatar
    "vectoroc написал сегодня в 03:13"
    и
    "Сделано своими руками"

    здесь значит багрепорты и писать? :)
    На моих часах уже 4.13
  • Андрей
    avatar
    Спасибо, почерпнул для себя много полезностей для ускорения своих проектов...
  • daedmen
    avatar
    Есть только одна проблема, надо учитывать не только относительный прирост скорости, но и абсолютный, а то синтетические тесты зло большое........

    Грубо говоря $a="text $b"; скажем занимает 0,0001 секунды, мы выигрываем заменяя офигенно много - 50% его на $a='text '.$b;
    но сам скрипт, в котором мы так много выиграли , работает 1 секунды, так что даже с учетом того что такой работы со строками у нас много, всеравно в масштабе всего скрипта выигрыш незначителен.

    Оптимизировать в любом языке можно только одним способом- включаешь профайлер и смотришь что тормозит, его и рефакторишь, иначе это все ересь......
  • Совершенно верно, я давече начал изучать неизвестный проект, а оказалось что в темплейтах идёт замена переменных через ereg_replace, причём с квадратной сложностью. Начал изменять - и вдруг пропала зависимость. Оказалось ещё и кэширование после первого показа встроено. А профайлером каким пользуетесь?
  • daedmen
    avatar
    xdebug
  • ksi
    avatar
    Полностью поддерживаю vectoroc'ом! наверное стоит задуматься над тем, что он предложил. : )
  • Часовой пояс непременной будет.. в своё время
  • Victor
    avatar
    Я не совсем понял что дает эта оптимизация
  • Это т.н. best practice - полезно использовать повсюду что-бы какая-то выгода была видна на сильнозагруженных проектах или там где большие объемы данных, циклов и рекурсия.

    Например я как-то изучал почему медленно работает одна мне мало знакомая интранет-система, в итоге докопался до того что переменные в самописном темплейт-движке ищутся в цикле с preg_replace и очень нечётким выражением. Так что мелочи имеют значение там где они повторяются в больших количествах.
  • Знание того, что написано в посте, врядле поможет людям, которые не умеют писать правильно. А вот если написано (спроектировано) все как раз правильно, то на такие мелочи можно внимания не обращать. Это верно в 90% случаев. Оставшиеся 10% должны писать те, кто давно все это знает — это самые сложные проекты.

    $test[a][b]=1; // писать в корень не правильно. Тут вообще нет смысла говорить о приросте. Если человек так пишет, он не знает PHP. Ему надо дать прочитать самоучитель.

    $a="text $b"; // я часто пишу так, и не считаю, что это плохо. Мой аргумент в точности совпадает с аргументацией от daedmen.

    Почему такая разница с foreach для меня остается загадкой. Возможно была допущена ошибка при измерениях?

    while (list($k, $v) = each($test)) — это PHP3. Если человек так пишет, он не знает даже PHP4, хотя уже пора знать PHP5. Ему надо дать прочитать самоучитель.

    Ну а чем меньше в коде регулярок, тем лучше — известная истина. Часто регулярное выражение можно заменить своим кодом со строковыми функциями. Но так мало кто делает, потому что RegExp намного удобнее и быстрее писать. Просто при их использовании нужно быть крайне внимательным.
  • Андрей
    avatar
    Ну, некоторые на своих ошибках и учатся... "Век учись, век живи!" ))
  • Быстрее всего всё-таки substr (не compare), см. последний тест в комментах.
  • Смотря на строчку:
    while (list($k, $v) = each($test))
    вспоминаешь старые времена ... :)
  • Enakin
    avatar
    Все это уже мифы, по крайней мере если используется PHP5, там это дело очень переработали. Можете сами проверить. Одиночный $a="text $b"; может и будет быстрее $a='text '.$b; на 2%, но уже для трех переменных будет обратная картина.
  • Евгений
    avatar
    Что это блиать такое и каким образом некорректная запись работает в 3,5 раза быстрее корректной?
    $test[a][b]=1; $text['a']['b']=2;
  • С кавычками - правильная версия. Без кавычек, PHP приходится проверять нет ли такой константы

Advertisers

Украсить Поздравление с днем рождения девушке и женщине.