| МИФЫ и ФАКТЫ (в моей интерпритации) жду коментариев от "сторожил" ;)
пройдитесь по пунктам наведите здоровую критику или подтвердите мои взгляды.
Дизайнер Якоб Нильсен всем известный и уважаемый пишет цифру 0,1 секунда
Это время которое человек не замечает гуляя по вебу (да и не только по вебу).
И я бы хотел уложиться в нее по возможности.
Мноие говорят что когда придет время тогда и оптимизируй, и что мол хороший
программист плохого кода не напишет ...
Ну т.е. кто самообучается значит им нужно усложнить задачу, методом фиг что скажем пусть шишки набивают ???
Есть люди из разряда умники ... я им рекомендую прочесть основы НЛП ;)
КАРТА это НЕ ТЕРРИТОРРИЯ
в данной конретной интерпритации: "Не нужно о других думать изходя из своего мнения о себе!!!"
Я придерживаюсь мнения:
"Конечно переделывать готовые проекты может и не разумно
но писать правильно новые мне кажется вполне разумно."
Я проделал занимательный тест надеюсь кому то мои данные пригодятся при разработке проекта:
Тест проведен на Атлон 900 256мб памяти апач+php5 (Топ-сервер)
Время во всех результатов МИНИМАЛЬНОЕ, а среднее значение больше на 30-50% , максимальное на все 100% и более.
Версия оперы (портабл)
Версия:
9.10
Сборка:
8679
Платформа:
Win32
Система:
Windows XP
Версия Java:
Java не установлен
Модуль XHTML+Voice:
Модуль не загружен
Идентификация браузера:
Opera/9.10 (Windows NT 5.1; U; ru)
************************************************
Минимальное время - 0.000036 секунд
function gettime()
{
$part_time = explode(' ',microtime());
$real_time = $part_time[1].substr($part_time[0],1);
return $real_time ;
}
$start_time=gettime();
$stop_time=gettime();
$dift_time2=bcsub($stop_time,$start_time,6);
echo ("Время $dift_time2." секунд <br>");
*************************************************************
Сделал пустой цикл 0.000079 секунд
$i = 1;
while ($i <= 84) {
$i++;}
*************************************************************
Сделал цикл с оператором echo "1" 0.000098 секунд
Вывод: оператор echo не сильно то и тормозит код выводом небольшого текста.
$i = 1;
while ($i <= 84) {
echo "1";
$i++;}
************************************************************
0.000210 секунд
Сделал цикл с оператором echo $i."1" 0.000210 секунд
Вывод: оператор echo не сильно то и тормозит код даже выводя переменные .
0.0002 секунды от 0,1 секунды к которой нужно стремиться это всего 1/500 часть
а выведено 84 значений переменной, пускай одной, пускай оно очень маленькое,
я не думаю что в реальной страницы нужно выводить очень много значений разных переменных с большим текстом
$i = 1;
while ($i <= 84) {
echo $i."1";
$i++;}
****************************************************************************************
Сделал цикл с оператором echo $i.$text 0.015791 секунд (ИЕ) 0.383239 секунд (ОПЕРА)
$text равно строке 1300 символов.
стариница стала 70600 байт
Вывод: Даже выводя много данных время вывода оператором ИЕ занимает 1/6 от 0,1 секунды .
$i = 1;
while ($i <= 84) {
echo $i.$text;
$i++;}
**************************************************************
Сделал цикл с оператором echo $text время 0.040739 секунд (ИЕ) максимум под 1.730124(ОПЕРА)секунд
браузер ее конечно за такое время не показывает (ИЕ тормозит) ОПЕРА грузит текст секунд за 4-5
Странно ... почему тест зависит от браузера ??? тест провожу пару раз и опера 1,7 ни как не уменьшает ...
При других тестах разница между ИЕ(6.02) и ОПЕРА не наблюдалась
ТЕКСТ РАЗМЕРОМ 5480 байт (без тегов)
Размер получившийся страницы 463467 байт 450 кб где то ...
Вывод: тут все очень просто такие страницы (больше 100кб) сгенировать статической по возможности .
$text ='ТЕКСТ .........'
$i = 1;
while ($i <= 84) {
echo $text
$i++;}
********************************************************************************
Вывод всего текста который за 400кб оператором echo текст находится в этом же скрипте.
Вывод осуществлялся оператором echo через переменную 0.025631 секунды
Вывод: время вывода большого фрагмента текста даже через переменную вполне допустимо.
0.025631 это 1/5 0,1 сек, а 400кб это цифра для теста в реальной жизни размер меньше на порядок.
********************************************************************************
подключение текста(всего) что выше в тесте , а не куска который гонялся в цикле.
0.134897 секунд ИЕ 1.805424 секунд в ОПЕРЕ
Я думаю что просто из-за того что опера выводит сразу она сильно напрягает проц , и из-за этого такая разница
Вывод: подлючение большого файла с текстом занял в 3 раза большее время чем вывод его оператором echo
хотя и в цикле .
include_once('test/big_text.php');
********************************************************************************
А теперь тест с подключением файлов include_once
Я не стал подключать паказывать данныые подключения пустых файлов
а добавил минимальный код, напомню что время вывода оператора echo в цикле 84 раза всего 0.000098 секунд
и то из них смело вычитаем 0.000036 секунд (минимальное время), так что выполнения операторов echo . только
для того что бы показать что подлючаются не пустые файлы, а то что код php который обрабатывается.
Несложно догодаться что даже подлючая пустые файлы результат фактически тот же самый!
содержание всех файлов:
<?php
echo "1";
?>
код теста:
$i = 1;
$start_time=gettime();
while ($i <= 84) {
include_once ("test/копия (".$i.") j.php");
$i++;}
$stop_time=gettime();
$dift_time2=bcsub($stop_time,$start_time,6);
$i=$i-1;
echo ("Время подключения ".$i." файлов- ".$dift_time2." секунд <br>");
Время подключения 1 файлов- 0.000658 секунд
Время подключения 2 файлов- 0.001158 секунд
Время подключения 4 файлов- 0.002777 секунд
Время подключения 7 файлов- 0.004085 секунд
Время подключения 8 файлов- 0.004488 секунд
Время подключения 10 файлов- 0.008708 секунд
Время подключения 12 файлов- 0.010072 секунд
Время подключения 14 файлов- 0.014550 секунд
Время подключения 16 файлов- 0.018654 секунд Время подключения тех же 16-ти файлов - 0.016159 секунд без примения цикла .
Время подключения 20 файлов- 0.028495 секунд
Время подключения 32 файлов- 0.045794 секунд
Время подключения 40 файлов- 0.054118 секунд
Время подключения 64 файлов- 0.108736 секунд
Время подключения 84 файлов- 0.138472 секунд
********************************************************************************
Ниже приведенный цикл показывает, что примения цикла скажем на вывод таблицы не так существенно
скажется на общем времени формирования страницы
время 0.002844 секунд это 1/30 от 0,1 секунды и равно подлючению include_once 20 пустых файлов
$text='dddsrjs';
$i = 1;
while ($i <= 1000) {
echo $i.$text;
$i++;}
********************************************************************************
Повторюсь еще раз, что все представленные результаты это МИНИМАЛЬНЫЕ , а фактические(средние) больше на 30-50% ,
а максимальные более 100%
Подключение 64 файлов становится 100% от 0,1 секунды, да и подлючались "пустышки" ,
хотя многие классы, особенно родительские могут из себя таковые и представлять.
Мне кажется бизнес-логика не съест много ресурсов (регулярные выражения отдельная тема).
Если вы не комерческий "продукт" и цифра 0,1 секунда вам кажется смешной, то можете смеять и смело инклудить ;)
Что говоря про оптимизацию циклов, то лично я не встречал в веб-приложениях
сложные вычисления в циклах, нет конечно найдутся личности которые мне скажут ЕСТЬ такое, но ведь
я говорю про общии случаи.
В тестах проведенных Дмитрием Бородиниым относительные показатели , а не абсолютные.
Нет конечно абсолютные нельзя получить из-за того что разное железок примеру.
// сколько раз исполнять код каждого варианта теста
$cn=50000;
встречается в паре его тестов .
Вот к примеру его первый тест у меня выполнялся 5.841496 секунд
при 500 повторениях время 0.078085 секунд на все тесты ...
все подлюченные файлы (_dima_speed.php и _dima_timestat.php я занес в основной код чтобы не вносить погрешности инлкудами )
Блин и честно сказать его тест:
{$x="test".$test; }
{$x="test $test"; }
{$x="test";$x.=$test;}
у меня неоднозначен ... то одно лидирует то другое
тока когда поставил обратно 5000 а при 1000 четкого лидера нет ...
Мой вывод : изходя из просмотра одного его теста могу предположить что
все его тесты должны (В ТЕОРИИ) лучшие результаты , ну уж на очень больших
скриптах, но почему то на маленьких результаты его тестов представляют
генератор случайных чисел, согласитесь цифра 500-1000 повторений это не так мало ...
Очень интересен и тест на имена переменных в его тесте стоит 50000 раз
Меняем на 1500 ... и мы получаем полоски эквалайзера :D)
test N2 1 0.0364 0.0364 165.5% 100.0%
test N3 1 0.0157 0.0157 14.6% 43.1%
test N11 1 0.0327 0.0327 138.2% 89.7%
test N13 1 0.0205 0.0205 49.1% 56.1%
из результатов следует что 32 символа в переменной лучше чем 2 :)
Нет конечно можно кричать что нужно верить результатам где больше повторений ...
возможно ... только вот напишите мне скрипт страницы хотябы с 5000 переменными :)
Я пожму вам руку.
Тест на массиы при 500 повторениях все также как и при 50000 а при 50 опять начались скачки.
Считаю что тест лучше провести на массиве с большим колличеством значений меньшее колличество раз,
а не большое колличество раз 5 элементами в массиве, хотя такой вариант тоже может где то примениться
в разработке.
=>РАБОТАЕТ <=
Могу лишь сказать что эффект от примения двойных кавычек все же наблюдается , даже
на молом числе повторений, хоть результаты и скачут но как правило с двойными кавычками и правду быстрее!!!
{$x="test".$myarray["test"]."test";}
{$x="test$myarray[test]test"; }
{$x="test{$myarray[test]}test"; }
ПО его словам:
"А теперь, на основании всех трех тестов, однозначный вывод: использовать фигурные скобки для обозначения
границ имени элемента многомерного массива НЕЛЬЗЯ. Это сильно снижает скорость работы - 25-30% (в третьем
варианте от простого добавления скобок скорость понизилась на четверть). Не использовать скобки нельзя.
Следовательно, единственный способ не терять 30% скорости - выносить многомерные массивы из скобок. "
Когда ставим
// сколько раз исполнять код каждого варианта теста
$cn=500;
Опять получаем генератор случайных чисел :) так что слепо верить в фигурные скобки я не стану.
такое лучше протестировать на реальном приложении по возможности .... Тупо гонять тест 50000 раз это не показатель.
Нужно создавать тесты приближенные к реальности!!!
На регулярных выражениях eregi быстрей как на больших так маленьких текстах ... а вот на очень маленьких тест показывает аналогичный результат.
-----------------------------------------------------------------------------
Оптимизация программ на PHP
Выносите $переменные из "текстовых строк" - ускорение 25-40%
Короткие переменные не более 7 символов - ускорение 15%
Тормозят ли массивы в PHP? Вернее, как именно. Ускорение 40%
Выносите многомерные массивы из "текстовых строк" - ускорение 25-30%
Регулярные выражения: PHP(POSIX) vs Perl. Ускорение 60-200%
Циклы: for, foreach, while, count/sizeof() - ускорение 15%-30%
Для чтения файла file() быстрее, чем fopen+цикл - ускорение 40%
Загрузка всех тестов (php файлы)
From: Дмитрий Бородин <http://php.spb.ru>;
Date: Mon, 20 Sep 2004 18:21:07 +0000 (UTC)
Subject: Оптимизация программ на PHP
Оригинал: http://php.spb.ru/
-------------------------------------------------------------------------------
Статья Михаила Саяпина из серии водолейства и мысли аля дзен
-------------------------------------------------------------------------------------------------------------------------------------------------
PHP Optimization I: Трезвый взгляд на оптимизацию
10-11 июля 2007 г., Михаил Саяпин
Перепечатка материалов только приветствуется. Хотя, мне будет приятно, если вы укажете ссылку на первоисточник.
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
статья имеет хоть какие то практические аспекты
Полезные мелочи программирования на PHP
ГЛАВНЫЙ ВЫВОД!
Что пришло в голову из всех тестов что можно создать "модуль" для тестирования каждого блока кода, и время заносить в массив. и в конце выдавать результат . Поскольку тестить на локальной версии сайта где нет БД не тоже самое, что и на сайте. Но и на лакальном можно
протестить хотябы узнать минимальное время . Можно сделать так что модуль отображал инфу о загрузке на каждой странице только разработчикам.
Лучше узнать сразу о "тормозах" и найти новое решение чем потом охать и ахать и переписывать связанные блоки кода (а такие скорее всего попадустся и их будет нужно еще найти) | |