Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> В погоне за скоростью, Сравнительные тесты конструкций PHP 
:(
    Опции темы
Bikutoru
Дата 2.6.2005, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: 8
Всего: 22



Доброго всем времени суток!

Не секрет, что при разработке WEB-приложенй время является одним из основных критических ресурсов. Действительно, посетитель может и не дождаться загрузки вашей страницы, если ждать придется достаточно долго. Поэтому, необходимо, по возможности, использовать использовать более скоростные конструкции. Конечно, нужно использовать грамотную архитектуру, продуманность запросов к базе, но это некасается темы топика. Здесь я предлагаю выкладывать сравнительные тесты различных решений небольших даже не задачек, а подзадачек. Вот выкладываю собственные тесты производительности различных конструкций... Надеюсь, что вы меня поддержите - и выложите собственные тесты уже каких-то других подзадачек...

Код


##############################################################
set_time_limit(1000);
$start = time();
##############################################################


/*
for ($i = 1; $i < 1000000; $i++)
{
    " " . (int)$i . " ";        //А здесь всего 8
//    " '" . addslashes($i) . "' ";    Здесь 14 секунд
}
*/

//=============================================================================

/*
for ($i = 1; $i < 2500000; $i++)
{
//    " $i ";    //32 секунды
    " " . $i . " ";    //25 секунд ~
}
*/

//=============================================================================

/*
    $s = "1234";
    for ($k = 0; $k < 5000000; $k++)
    {
      //" $s ";//23 секунды

      //" " . $s . " "; // 19 секунд
    }
*/

//====================================================================

/*
for ($i = 1; $i < 2500000; $i++)
{
//    "$i";    //22
    $i;    //6!!!
}
*/

//====================================================================

//====================================================================

/*
for ($i = 1; $i < 5000000; $i++)
{
//    if ($i != 0);    //15 секунд
    if ($i);    //12 секунд ~ 20%
}
*/

//====================================================================

/*
for ($i = 1; $i < 5000000; $i++)
{
//    $k = 1;
//   if ($k); //Вместе 15 секунд

   if ($k = 1); //13 секунд ~
}
*/

//====================================================================

/*
$array = array ("one" => 1, "two" => 2, "" => 3, "four" => 4, "five" => 5, "six" => 6, "seven" => 7, "eight" => 8, "nine" => 9, "ten" => 10);

for ($i = 1; $i < 250000; $i++)
{
//    foreach ($array as $key => $value);    //17 секунд ~ 45%

//    reset($array);    //32 секунды
//   while (list($key, $value) = each($array));
}
*/

//====================================================================

/*
    for ($k = 0; $k < 250000; $k++)
    {
      //foreach ($array as $key => $value);//19

       //reset($array);//Данная строка влияет на результат незначительно (менее 1 секунды)
       //while (list($key, $value) = each($array));//39

    }
*/

//====================================================================

/*
    for ($k = 0; $k < 2500000; $k++)
    {
      //if (gettype($array) == "array");//19

      //if (is_array($array));//10
    }
*/

//====================================================================

/*
    for ($i = 1; $i < 2500000; $i++)
    {
        //floor($i / 3);//13 секунд

        //(int)($i / 3);//7 секунд
    }

*/

//====================================================================

/*
    for ($i = 1; $i < 2500000; $i++)
    {
     //text_without_quotes;//35
        //"text_without_quotes";//5!
    }
*/


##############################################################
echo (time() - $start);
##############################################################



С удовольствием выслушаю ваши вопросы, возражения, предложения.

Это сообщение отредактировал(а) Bikutoru - 2.6.2005, 18:46


--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
Opik
Дата 2.6.2005, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: 24
Всего: 55



Код

    for ($i = 1; $i < 2500000; $i++)
    {
        //floor($i / 3);//13 секунд

        //(int)($i / 3);//7 секунд
    }

хм, а что тут сравнивать? floor и int - разные вещи.
Добавлено @ 18:52
А по поводу такой "оптимизации" написано тут:
http://php.spb.ru/php/speed.html
PM MAIL Skype   Вверх
Bikutoru
Дата 2.6.2005, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: 8
Всего: 22



Opr, спасибо за ссылку

Цитата
хм, а что тут сравнивать? floor и int - разные вещи.


Конструкция (int)$expr преобразует $expr к целому типу. Если $expr - дробное число, то дробная часть аргумента отбрасывается. Насколько мне известно, floor делает тоже самое.
Пример:
Код

$a = 1.0000000001;
$b = (int)$a;
$c = floor($a);

echo $a . "<BR>" . $b . "<BR>" . $c;


Это сообщение отредактировал(а) Bikutoru - 2.6.2005, 19:09


--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
Mal Hack
Дата 2.6.2005, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 122
Всего: 261



Цитата(Bikutoru @ 2.6.2005, 19:59)
Насколько мне известно, floor делает тоже самое.

Нет. Он округляет в меньшую (вроде) сторону.

Цитата(Bikutoru @ 2.6.2005, 19:42)
Надеюсь, что вы меня поддержите - и выложите собственные тесты уже каких-то других подзадачек...

Это все очень индивидуально. Зависит как и от модульной структуры, так и от алгоритма работы ну и от объяма данных.
Поверхностно (не приминительно к реальным задачам) нельзя серьезно говорить о быстродействии...
PM ICQ   Вверх
Bikutoru
Дата 3.6.2005, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: 8
Всего: 22



Цитата
Нет. Он округляет в меньшую (вроде) сторону.

С точки зрения математики, округлить в меньшую сторону - это отбросить дробную часть аргумента и вернуть его целую часть. Так в чем разница?
Цитата
нельзя серьезно говорить о быстродействии...

Я не говорю, что данная идея позволит в разы сократить время работы скрипта, для этого гораздо эффективнее использовать грамотную архитектуру системы и разумную организацию sql-запросов, но в некоторых задачах, где есть большой объем расчетов (какая-то статистическая обработка например), и это может сыграть какую-то роль. Если две конструкции делают одно и то же, то зачем использовать более медленную?

Это сообщение отредактировал(а) Bikutoru - 3.6.2005, 09:18


--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
Mal Hack
Дата 3.6.2005, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 122
Всего: 261



Цитата(Bikutoru @ 3.6.2005, 10:13)
С точки зрения математики, округлить в меньшую сторону - это отбросить дробную часть аргумента и вернуть его целую часть. Так в чем разница?

Одно дело округлить, другое привести к типу !!!
К томуже как непосредственно работает данное округление в PHP - я не знаю, надо в сырцах рыться.

Цитата(Bikutoru @ 3.6.2005, 10:13)
Если две конструкции делают одно и то же, то зачем использовать более медленную?

Это опять же зависит от задачи. Да, есть в PHP вещи, которыми можно к одному результату придти разными способами.

PM ICQ   Вверх
Bikutoru
Дата 3.6.2005, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: 8
Всего: 22



Цитата
Одно дело округлить, другое привести к типу !!!

Я тут накидал небольшой тестик
Код

$values = array (
    1.000001,
         1.99999,
         99999999999999999999999999999, //Вот тут сбой, но такие большие
                              //числа применяются очень редко
         "1.56",
         "1.11",
         "Not a number");

$res_array = array();
foreach ($values as $cur_value)
{
    $res_array["a"] = $cur_value;
    $res_array["b"] = (int)($res_array["a"]);
    $res_array["c"] = floor($res_array["a"]);

    $res_array["d"] = $res_array["a"] + 1;
    $res_array["e"] = $res_array["a"] . "*";
    $res_array["f"] = gettype($res_array["a"]);
    $res_array["g"] = (double)($res_array["a"]);


    echo implode("<BR>", $res_array);
    echo "<BR><BR>";
}



Смотри (int) и floor() дают одинаковый результат, если не брать в расчет очень большие числа...

Цитата
Да, есть в PHP вещи, которыми можно к одному результату придти разными способами.


Для этого топик и задумывался...


--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
Mal Hack
Дата 3.6.2005, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 122
Всего: 261



Цитата(Bikutoru @ 3.6.2005, 18:42)
Смотри (int) и floor() дают одинаковый результат, если не брать в расчет очень большие числа...

Давай сюда еще usbstr также припахаем. Рэги... Которыми можно получить желаемый резальтат.


Цитата(Bikutoru @ 3.6.2005, 10:13)
Если две конструкции делают одно и то же, то зачем использовать более медленную?

ДВУХ одинаковых консструкций не бывает. (int) и floor выполняют разные задачи !!!!
А поэтому, их нельзя рассматтривать отдельно. Их надо смотреть в комплексе кода всего скрипта.
PM ICQ   Вверх
Bikutoru
Дата 4.6.2005, 09:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: 8
Всего: 22



Цитата
ДВУХ одинаковых консструкций не бывает

Не скажи:
Код


$a = floor($in / 100);


и
Код


$a = (floor($in) - (floor($in) % 100)) / 100;


Как говорится, найдите 10 отличий :-)


Ладно, проехали...

Это сообщение отредактировал(а) Bikutoru - 6.6.2005, 12:02


--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
Djibo
Дата 4.6.2005, 17:31 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











(int) и floor() вещи разные и давайте таки не будем их сравнивать.
то что они работают по разному ты хоть и не сразу но осознал.
  Вверх
Bikutoru
Дата 6.6.2005, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: 8
Всего: 22



Во-первых, я не говорил, что это оджно и то же, я говорил,что при опред. условиях ими можно получить одинаковые резульататы, а во-вторых,
Цитата
проехали...



--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0638 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.