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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Производительность ссылок, Имеются противоречивые данные 
:(
    Опции темы
Platon
Дата 14.4.2007, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: нет
Всего: 40



Здравствуйте, уважаемые.

Имеются противоречивые данные, о производительности данных, передаваемых по ссылке.

Источник http://php.spb.ru/php/speed.html говорит нам что foreach($arr as $val) тормозящая штука, ибо каждый элемент массива копируется в новый экземпляр.

Но тут же нахожу в Zend Studio при анализе кода, что производительность функции типа doSomething(&$var) {} убивается от того, что я передаю объект по ссылке, мол "$var в функции не меняет значений, нефиг передавать по ссылке, делай обычный doSomething($var)".

Хм, странно, чему же верить? Не исключаю, что это совсем разные вещи. Прошу помочь разобраться.

Это сообщение отредактировал(а) Platon - 14.4.2007, 16:23
PM MAIL ICQ   Вверх
GZep
Дата 14.4.2007, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


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

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



вот написАл скриптик для подсчета времени выполнения таких конструкций...
Код

<?php
function testfunc($var) {
    return $var;
}
function takeRef($a) {
    foreach ($GLOBALS as $key => $one_glob) {
        if ($key === "GLOBALS")
            continue;
        testfunc(&$one_glob);
    }
}

function takeVal(&$a) {
    foreach ($GLOBALS as $key => $one_glob) {
        if ($key === "GLOBALS")
            continue;
        testfunc($one_glob);
    }
}
test("takeVal");
test("takeRef");
function test($func) {
   for ($a = array(), $i=1; $i<=100000; $i++)
       $a[$i] = $i;
   $t = time();
   while ($t == time());
   for ($N = 0, $t = time(); time() == $t; $N++)
       $func($a);
   printf("<tt>$func</tt> took %d itr/sec<br />", $N);
}
?>

спасибо Д. Котерову за идею!


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
Platon
Дата 14.4.2007, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: нет
Всего: 40



Честно сказать, выглядит ужасно, еще заодно объясни как это работает?
PM MAIL ICQ   Вверх
vasac
Дата 14.4.2007, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1060
Регистрация: 4.5.2006

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



В PHP реализована такая фишка, как "отложенное копирование".
Например:
Код

$A = Array( <Огромный массив> );
$B = $A; // Никакого копирования здесь фактически не происходит, а обе переменные связываются с одним значением.
$B[ 10 ] = 11; // А вот здесь изменяется структура и идет копирование


При передаче в функцию по значению происходит тоже самое (то есть ничего не происходит - значение на которое указывает глобальная переменная в локальную не копируется). Так что если переданное значение внутри не изменяется передача по значению не будет тормозить работу.
PM WWW   Вверх
Platon
Дата 14.4.2007, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: нет
Всего: 40



воот! этот ответ я и ожидал услышать, я подозревал, что это так, здорово! спасибо.

Добавлено через 3 минуты и 15 секунд
Но что же делать с данными с сайта http://php.spb.ru/php/speed.html

там же никакого копирования также не происходит, я имею ввиду foreach

Это сообщение отредактировал(а) Platon - 14.4.2007, 19:19
PM MAIL ICQ   Вверх
skyboy
Дата 14.4.2007, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


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

Репутация: 75
Всего: 260



данные тестирования от 13 ноября 2001 года(см. название архива с текстом всех тестов). Это, наверное, РНР 3 smile
Я тоже оттакивался в своё время от результатов на php.spb.ru, но, видать, данные давненько уже не актуальны  smile 
PM MAIL   Вверх
GZep
Дата 14.4.2007, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


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

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



Platon, отложенное копирование в случае с циклами не катит, к сожалению...и скорость работы ссылок благопалучно падает. Это можно наглядно посмотреть в приведенном мною примере.

В этом примере выполняется 2 варианта цикла: с ссылкой и без. Оба цикла обходят массив $GLOBALS. Оба цикла выполняются огромное количество раз, чтобы можно было засечь время работы...


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
SelenIT
Дата 14.4.2007, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 32
Всего: 401



GZep, во-первых, time() - имхо слишком грубый инструмент для замера быстродействия, есть же microtime. Во-вторых, попробуйте интереса ради поменять местами вызовы test("takeVal") и test("takeRef") в Вашем коде - возможно, результат Вас немного удивит... ;)

Upd.: переделал так, чтоб свести к минимуму побочные эффекты:
Код

function test1() {
   $args = func_get_args();
   $N = array_fill(0, $args_num=count($args), 0); 
   $a = range(1, 100000);
   for ($i = 0; $i<5000; $i++) { // 5000 повторов для статистики, можно еще больше, да ждать долго...
      for ($j=0; $j<$args_num; $j++) {
     $t = microtime(true);
         $args[$j]($a);
         $N[$j] += (microtime(true) - $t); // замеряем время только вызова ф-ции, без самого цикла и т.п.
      }
   }
   for ($j=0; $j<$args_num; $j++)
      printf('<tt>%s</tt> took %01.1f itr/sec<br />', $args[$j], 5000/$N[$j]);

}
test1('takeVal','takeRef');

сам удивился, но вынужден согласиться с Вашей оценкой (по крайней мере в случае PHP5.2.1/Apache/2.0.58/WinXP). Причем торможение происходит именно "по вине" testfunc(&$one_glob), а способ передачи массива во внешнюю ф-цию роли не играет...

Это сообщение отредактировал(а) SelenIT - 14.4.2007, 23:48


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
Всемогущий
Дата 15.4.2007, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 5
Всего: 13



SelenIT, интерпритатор ругается на ошибку в восьмой строке   $args[$j]($a);

Fatal error: Call to undefined function takeVal() 


--------------------
Цитата(smartov @  16.1.2007,  13:26 Найти цитируемый пост)
Видел я PHP код, который пишут наСильники, никогда на php не писавшие  :D  То еще зрелище. Все пытаются сделать руками и через ж (как в С привыкли). Все пытаются память освобождать итд итп. 
PM MAIL ICQ   Вверх
SelenIT
Дата 15.4.2007, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 32
Всего: 401



Сорри, я забыл пояснить - takeRef, takeVal и testfunc остались без изменений из примера GZepа. Я лишь заменил саму процелуру сравнения производительности на более, на мой взгляд, объективную...


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
nerezus
Дата 15.4.2007, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


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

Репутация: 12
Всего: 43



Цитата

Источник http://php.spb.ru/php/speed.html говорит нам
 Фигню он говорит нам. примеры тепличные. На реальных примерах прироста практически не будет, а вот гемора прибавится изрядно. Да и скорость работы веб-приложения в первую очередь зависит от алгоритма, БД, вебсервера и ОС.

А сабж передается по ссылке. И только когда ты его начнешь изменять, он скопируется.


Цитата

Но что же делать с данными с сайта http://php.spb.ru/php/speed.html

там же никакого копирования также не происходит, я имею ввиду foreach
 Забить..


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
GZep
Дата 16.4.2007, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


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

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



SelenIT, time тут используется не для замера времени а для другой цели:

Скрипт начинает замерять время выполнения только с начала какой-нить секунды (например есть время: 2min:10sec - ждем, 2:20 - ждем.....ждем....3:00 - поехали!) остановка работы соответственно на 4:00. Так что скрипт весьма и весьма точен. smile 


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.1015 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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