Задать вопрос

Дают ли выигрыш ссылки на элементы массива и на поля объектов в PHP?

Из описания ссылок в документации php не очень понятно, дает ли какой-то выигрыш в производительности использование ссылок на элементы массивов, на поля объектов.

Например, есть ли преимущество в производительности такого кода
$ref = &$obj->arr[$i];

$ref->field_1 = val_1;
$ref->field_2 = val_2;
...
$ref->field_n = val_n;
в сравнении с таким
$obj->arr[$i]->field_1 = val_1;
$obj->arr[$i]->field_2 = val_2;
...
$obj->arr[$i]->field_n = val_n;


Быть может, при доступе по ссылке не нужно каждый раз вычислять адрес промежуточного объекта $obj->arr[$i]? Или система доступа к переменным php такова, что ссылки не дают такой экономии?
  • Вопрос задан
  • 308 просмотров
Подписаться 3 Средний 8 комментариев
Пригласить эксперта
Ответы на вопрос 3
ipatiev
@ipatiev Куратор тега PHP
Потомок старинного рода Ипатьевых-Колотитьевых
С точки зрения памяти не даёт, потому что в РНР и так очень оптимальное управление памятью.
В частности, при присвоении значений переменным применяется принцип copy-on-write. Объекты же и так всегда копируются по ссылке.

С точки зрения "вычислять адрес промежуточного объекта" - я никогда не слышал о таких проблемах. Судя по всему, это явно не является узким местом для динамически интерпретируемого языка.
В любом случае, учитывая copy-on-write, исходно это снова будет опять ссылка.

В общем, я настоятельно рекомендую последовать совету мудрого старика Дональда Кнута, и не бежать впереди паровоза, заранее пытаясь оптимизировать то, что вообще никогда не тормозит.
Данный случай является просто идеальной иллюстрацией именно такого случая, когда проблемы от непредсказуемого поведения кода из-за пихания ссылок везде и всюду стократно превысят любые воображаемые плюсы.
Ответ написан
SilenceOfWinter
@SilenceOfWinter Куратор тега PHP
та еще зажигалка...
все зависит от ситуации. в большинстве случаев дает т.к. ссылка занимает меньше места в памяти, чем значение.
Ответ написан
Комментировать
@galliard
В данном случае не нужны никакие ссылки, просто делаете так:
$ref = $obj->arr[$i];

$ref->field_1 = val_1;
$ref->field_2 = val_2;
...
$ref->field_n = val_n;

И работать будет быстрее, и памяти меньше сожрет.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы