За последние 24 часа нас посетили 22618 программистов и 1015 роботов. Сейчас ищут 705 программистов ...

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

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

  1. Технически - внутри, это разные вещи, поэтому сравнивать их нельзя.
     
  2. vuzy

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

    С нами с:
    11 мар 2010
    Сообщения:
    199
    Симпатии:
    0
    Адрес:
    киев
    вот еще одна идея появилась...
    Как влияют пустые строчки в коде на быстродействие скрипта.
    Проводился аналогичный эксперемент с переменными и было совершенно очевидно что переменная с именем в 40 символов существенно тормозит сценарий... Конечно пустые строки это не переменные но тем не менее интерестно же.
    И так тест начался и ничего не показал...
    HTML:
    1.  
    2. тест быстродействия скрипта:
    3. контрольный замер:
    4. 0.003178
    5. 0.003169
    6. 0.003175
    7. 0.003152
    8. 0.003228
    9.  
    10. 5 пустых строк перед скриптом:
    11. 0.003273
    12. 0.00318
    13. 0.003252
    14. 0.003622
    15. 0.003167
    16.  
    17. 40 пустых строк перед скриптом
    18. 0.003178
    19. 0.003199
    20. 0.003152
    21. 0.003197
    22. 0.003202
    23.  
    24.  
    25. 5 пустых строк после скрипта
    26. 0.003239
    27. 0.003286
    28. 0.003167
    29. 0.003209
    30. 0.003199
    31.  
    пустые строки положительно влияют на читабельность скрипта и никак не влияют на его быстродействие.
    Даже эффект "поспал на Enter'e" мало отразился на скорости выполнения операции цифры были примерно такими:
    0.003181
    0.003624
    0.003234
     
  3. Костян

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

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    vuzy
    лучше померить на строки, а однострочные комментарии между кодом
     
  4. Костян

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

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    Volt(220)
    а теперь заюзай mysqli c PS и сравни результаты на сколько вывод в цикле стал ближе или дальше к одному запросу. Ну если не влом.
     
  5. Psih

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

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Я бы попросил все пред идущие тесты оформить в один большой пост, с нормальными рассуждениями, что бы было понятно всем. Ибо на данный момент у меня лично мозг срывает, ставить ссылку с первой страницы на тесты не буду.
     
  6. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
  7. Volt(220)

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

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Костян
    Сделал, добавил к остальным.
    Фигня какая-то получилась. =))
     
  8. Костян

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

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    круто!
     
  9. vuzy

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

    С нами с:
    11 мар 2010
    Сообщения:
    199
    Симпатии:
    0
    Адрес:
    киев
    mysqli вроде как быстрее соображает...
     
  10. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Эффективное уменьшение изображений, или как можно сэкономить 400% времени.
    Типичная задача - пропорционально уменьшить изображение со сглаживанием.
    Код (PHP):
    1. <?php
    2. $start = microtime(1);
    3. $ava = imagecreatefromjpeg('1.JPG'); // Фотография, 3648x2736, 3660кб
    4. // Сглаживаемое уменьшение
    5. $x = imagesx($ava);
    6. $y = imagesy($ava);
    7. $qr = ($x > $y $x : $y) / 210;
    8. $nx = round($x / $qr);
    9. $ny = round($y / $qr);
    10. $sava = imagecreatetruecolor($nx, $ny);
    11. imagecopyresampled($sava, $ava, 0, 0, 0, 0, $nx, $ny, $x, $y);
    12. echo 'Resampled max memory usage: '.round(memory_get_usage()/1024, 2),' Kb<br>';
    13. echo '<br>';
    14. echo substr(microtime(1) - $start, 0, 6); 
    Код (Text):
    1. Resampled max memory usage: 49050.77 Kb
    2.  
    3. 3.1943
    Три секунды - это слишком, даже если php работает под windows 7 =)
    Оказывается, если предварительно уменьшить изображение без сглаживания, можно выйграть до 400% времени. Чем больше изображение, тем больше времени мы сэкономим:
    Код (PHP):
    1. <?php
    2. $start = microtime(1);
    3. $ava = imagecreatefromjpeg('1.JPG');
    4. // Простое уменьшение
    5. $x = imagesx($ava);
    6. $y = imagesy($ava);
    7. $qr = ($x > $y $x : $y) / 420;
    8. $nx = round($x / $qr);
    9. $ny = round($y / $qr);
    10. $sava = imagecreatetruecolor($nx, $ny);
    11. imagecopyresized($sava, $ava, 0, 0, 0, 0, $nx, $ny, $x, $y);
    12. echo 'Resized max memory usage: '.round(memory_get_usage()/1024, 2),' Kb<br>';
    13. $ava = $sava;
    14. // Сглаживаемое уменьшение
    15. $x = imagesx($ava);
    16. $y = imagesy($ava);
    17. $qr = ($x > $y $x : $y) / 210;
    18. $nx = round($x / $qr);
    19. $ny = round($y / $qr);
    20. $sava = imagecreatetruecolor($nx, $ny);
    21. imagecopyresampled($sava, $ava, 0, 0, 0, 0, $nx, $ny, $x, $y);
    22. echo 'Resampled max memory usage: '.round(memory_get_usage()/1024, 2),' Kb<br>';
    23. echo '<br>';
    24. echo substr(microtime(1) - $start, 0, 6); 
    Код (Text):
    1. Resized max memory usage: 49543.95 Kb
    2. Resampled max memory usage: 911.55 Kb
    3.  
    4. 0.7314
    Качество получаемого изображения у обоих вариантов почти одинаковое. У второго, разве что, на контрастных диагоналях чуть более заметны лесенки.
     
  11. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Давно слышал, что использование рекурсивной функции для нахождения факториала ГОРАЗДО медленней других способов. Решил проверить, чисто из любопытства, причем на РНР.

    Код (PHP):
    1. <?php
    2.  
    3. /**
    4.  * Стандартная функция нахождения факториала.
    5.  * Реализована "тыщу" раз
    6.  */
    7. function Factorial($number) {
    8.     if($number <= 1) {
    9.         return 1;
    10.     } else return ($number * Factorial($number - 1));
    11. }
    12.  
    13. /**
    14.  * ================================================
    15.  */
    16. $start = microtime(true);
    17.  
    18. for($i = 1; $i <= 100; $i++) {
    19.     Factorial($i);
    20. }
    21. echo (microtime(true) - $start) * 1000 . "\r\n";
    22.  
    23.  
    24. /**
    25.  * ================================================
    26.  */
    27. $start = microtime(true);
    28.  
    29. $result = 1;
    30. $factorial = 100;
    31.  
    32. for($i = 1; $i <= $factorial; $i++) {
    33.     $result *= $i;
    34. }
    35.  
    36. echo (microtime(true) - $start) * 1000 . "\r\n";
    37.  
    38. ?>
    Результаты:
    Код (Text):
    1. C:\Users\Apple>php -f D:\htdocs\listing.php
    2. 28.565883636475
    3. 0.51212310791016
    4.  
    5. C:\Users\Apple>
    Ничего нового.
     
  12. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    не корректный пример с циком. Ты циклом считашь только 100!, а реккурсивно 1!, 2!, 3!…100!
    На результаты замеров повлияет не сильно, но это fake
     
  13. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
  14. Psih

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

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Подшил свежие тесты в первое сообщение.
     
  15. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    PHP:
    1. <?/*
    2. error_reporting(E_WARNING | E_ERROR);
    3. $time=microtime(1);
    4. for($i=0;$i<100000;$i++) if($var['key']){}
    5.  
    6. print "no Nocite; Time: ".(microtime(1)-$time);
    7. //no Nocite; Time: 0.110560178757
    8. //no Nocite; Time: 0.133510112762
    9. //no Nocite; Time: 0.131765127182
    10.  
    11. */
    12. /*
    13. error_reporting(E_ALL);
    14. $time=microtime(1);
    15. for($i=0;$i<100000;$i++) if(@$var['key']){}
    16.  
    17. print "with Nocite; Time = ".(microtime(1)-$time);
    18. //with Nocite; Time = 0.247816085815
    19. //with Nocite; Time = 0.249211788177
    20. //with Nocite; Time = 0.234683990479
    21. */
    22.  
    23. $time=microtime(1);
    24. for($i=0;$i<100000;$i++) if(!empty($var['key'])){}
    25.  
    26. print "with check Nocite; Time = ".(microtime(1)-$time);
    27.  
    28. //with check Nocite; Time = 0.026829957962
    29. //with check Nocite; Time = 0.0329627990723
    30. //with check Nocite; Time = 0.0266950130463
    31. ?>
    нотисы зло. производительность упала в целых два раза на 100000 нотисов
    никаких собак в коде =)

    но на самом деле нотисы нужно предотвращать гуманными методами
     
  16. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    Mr.M.I.T.
    а если
    1. error_reporing(0)
    2. display_errors 0
    3. error_log /phperror.log
    4. ключи массива без кавычек
     
  17. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    на такое я не согласен =)

    нене, мораль в "with check Nocite"
     
  18. Апельсин

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

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    Есть 10 полей varchar, все одинакового содержания, 10 000 записей. Нужно выбрать только 9.
    Что быстрее:
    1.SELECT * (не важно что 10-е поле не используем);
    2. SELECT t1, t2, t3, t4, t6, t7, t8, t9, t10.
     
  19. Костян

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

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

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

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    SELECT * FROM `t`
    10,000 всего, запрос занял 0.0010 сек.
    10,000 всего, запрос занял 0.0012 сек.
    10,000 всего, запрос занял 0.0365 сек.
    10,000 всего, запрос занял 0.0365 сек.
    10,000 всего, запрос занял 0.0366 сек.

    SELECT id,q1,q2,q3,q4,q5,q6,q8,q9
    10,000 всего, запрос занял 0.0011 сек.
    10,000 всего, запрос занял 0.0365 сек.
    10,000 всего, запрос занял 0.0011 сек.
    10,000 всего, запрос занял 0.0011 сек.
    10,000 всего, запрос занял 0.0010 сек.

    это печально..
     
  21. Костян

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

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    на сколько я понимаю, большая часть корректности тестов формируется по знанию кода, с помощью которог тесты проводились. Намёк понятен? ))
     
  22. Апельсин

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

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    Костян
    У меня нет столько времени, чтоб заморачиваться над этим) и так уговорить себя пришлось, чтоб табличку создать, записей накидать, покопипастить на форум :)
     
  23. Костян

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

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    Апельсин
    так как тебя понимать. Вывод из теста - "это печально"?
     
  24. Апельсин

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

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    Костян

    а по сути дела - думал что (*) обойдет по скорости. Но нет.
     
  25. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    база то реляционная, ес-но выборка всего будет медленее