![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| Platon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 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 |
|||
|
||||
| GZep |
|
|||
![]() участник Винграда ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1528 Регистрация: 7.7.2006 Где: Москва Репутация: 8 Всего: 32 |
вот написАл скриптик для подсчета времени выполнения таких конструкций...
спасибо Д. Котерову за идею! -------------------- ![]() ![]() |
|||
|
||||
| Platon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1801 Регистрация: 25.4.2006 Репутация: нет Всего: 40 |
Честно сказать, выглядит ужасно, еще заодно объясни как это работает?
|
|||
|
||||
| vasac |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1060 Регистрация: 4.5.2006 Репутация: 8 Всего: 36 |
В PHP реализована такая фишка, как "отложенное копирование".
Например:
При передаче в функцию по значению происходит тоже самое (то есть ничего не происходит - значение на которое указывает глобальная переменная в локальную не копируется). Так что если переданное значение внутри не изменяется передача по значению не будет тормозить работу. |
|||
|
||||
| Platon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1801 Регистрация: 25.4.2006 Репутация: нет Всего: 40 |
воот! этот ответ я и ожидал услышать, я подозревал, что это так, здорово! спасибо.
Добавлено через 3 минуты и 15 секунд Но что же делать с данными с сайта http://php.spb.ru/php/speed.html там же никакого копирования также не происходит, я имею ввиду foreach Это сообщение отредактировал(а) Platon - 14.4.2007, 19:19 |
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 75 Всего: 260 |
данные тестирования от 13 ноября 2001 года(см. название архива с текстом всех тестов). Это, наверное, РНР 3
Я тоже оттакивался в своё время от результатов на php.spb.ru, но, видать, данные давненько уже не актуальны |
|||
|
||||
| GZep |
|
|||
![]() участник Винграда ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1528 Регистрация: 7.7.2006 Где: Москва Репутация: 8 Всего: 32 |
Platon, отложенное копирование в случае с циклами не катит, к сожалению...и скорость работы ссылок благопалучно падает. Это можно наглядно посмотреть в приведенном мною примере.
В этом примере выполняется 2 варианта цикла: с ссылкой и без. Оба цикла обходят массив $GLOBALS. Оба цикла выполняются огромное количество раз, чтобы можно было засечь время работы... -------------------- ![]() ![]() |
|||
|
||||
| SelenIT |
|
|||
![]() баг форума ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3996 Регистрация: 17.10.2006 Где: Pale Blue Dot Репутация: 32 Всего: 401 |
GZep, во-первых, time() - имхо слишком грубый инструмент для замера быстродействия, есть же microtime. Во-вторых, попробуйте интереса ради поменять местами вызовы test("takeVal") и test("takeRef") в Вашем коде - возможно, результат Вас немного удивит... ;)
Upd.: переделал так, чтоб свести к минимуму побочные эффекты:
сам удивился, но вынужден согласиться с Вашей оценкой (по крайней мере в случае PHP5.2.1/Apache/2.0.58/WinXP). Причем торможение происходит именно "по вине" testfunc(&$one_glob), а способ передачи массива во внешнюю ф-цию роли не играет... Это сообщение отредактировал(а) SelenIT - 14.4.2007, 23:48 -------------------- Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму! |
|||
|
||||
| Всемогущий |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 440 Регистрация: 25.6.2006 Где: Челябинск Репутация: 5 Всего: 13 |
SelenIT, интерпритатор ругается на ошибку в восьмой строке $args[$j]($a);
Fatal error: Call to undefined function takeVal() |
|||
|
||||
| SelenIT |
|
|||
![]() баг форума ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3996 Регистрация: 17.10.2006 Где: Pale Blue Dot Репутация: 32 Всего: 401 |
Сорри, я забыл пояснить - takeRef, takeVal и testfunc остались без изменений из примера GZepа. Я лишь заменил саму процелуру сравнения производительности на более, на мой взгляд, объективную...
-------------------- Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму! |
|||
|
||||
| nerezus |
|
||||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: 12 Всего: 43 |
А сабж передается по ссылке. И только когда ты его начнешь изменять, он скопируется.
|
||||
|
|||||
| GZep |
|
|||
![]() участник Винграда ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1528 Регистрация: 7.7.2006 Где: Москва Репутация: 8 Всего: 32 |
SelenIT, time тут используется не для замера времени а для другой цели:
Скрипт начинает замерять время выполнения только с начала какой-нить секунды (например есть время: 2min:10sec - ждем, 2:20 - ждем.....ждем....3:00 - поехали!) остановка работы соответственно на 4:00. Так что скрипт весьма и весьма точен. -------------------- ![]() ![]() |
|||
|
||||
![]()
|
| Правила форума "PHP" | |
|
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |