Действительно ли полезно для производительности передавать значения по ссылке в foreach в PHP 7 - PullRequest
0 голосов
/ 12 ноября 2018

Начиная с PHP7.0, циклы foreach были изменены, и было установлено новое поведение, чтобы ссылаться быстрее, чем раньше (foreach $ tab как & $ val).

Но я много раз читал, что передача по ссылке на самом деле иногда медленнее, чем обычный цикл (foreach $ tab как $ val)

Это всегда быстрее? Всегда медленнее? Зависит ли это от того, что мы делаем в цикле foreach? Поскольку ссылки в PHP не являются ссылками, это сбивает с толку ... Мне немного надоело читать разные ответы на эту тему в Интернете, и я не могу понять, где правда.

Спасибо, что привели сюда немного света;)

Источник: https://blog.eduonix.com/web-programming-tutorials/learn-changes-foreach-statement-php-7/ Источник: http://php.net/manual/fr/control-structures.foreach.php Источник: http://php.net/manual/en/language.references.arent.php ...

Ответы [ 2 ]

0 голосов
/ 18 ноября 2018

Резюме: Вы беспокоитесь о несуществующей проблеме производительности.

Детали

PHP использует "COW" (Копировать при записи).

Нормальное прохождение ($val):

  • Скаляр - передать значение. Запись в него изменяет только локальную копию.
  • Структура / массив / и т.д. - передать указатель на него. Если получатель (foreach loop или function body) хочет изменить какую-либо часть структуры, структура копируется. Стоимость пропорциональна размеру конструкции.

Передача по ссылке (&$val):

  • Скаляр - передайте указатель на скаляр, чтобы внутренности могли его изменить.
  • Структура - передать указатель. Если получатель пишет в структуру, он просто (эффективно) проходит через указатель, чтобы добраться до элемента в структуре. Нет коровы.

Мудрость в дизайне заключается в том, что 99% времени PHP "просто работает", и эффективны, и пользователю не нужно знать, что есть два прохождения. методы. Сложность в том, что вам нужно понять, когда делать &$val вещь.

PHP отличается от практически всех других языков.

  • АЛГОЛЬ 60 - Передача по значению или «имени» (вроде как анонимные функции в новых языках)
  • FORTRAN - проходить только по «ссылке» (указателю). Недостатком является то, что если вы передаете литерал, получатель может изменить значение литерала! (Хорошо, это была «ошибка», запеченная в старых компиляторах.)
  • C - Только передать по значению. Но вы можете сказать (с синтаксисом), что вы хотите указатель на объект, а затем разыменование внутри.
  • Паскаль - Значение или Ссылка, но не идентичные чему-либо выше (я забыл детали).

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

Вернуться к вопросу:

  • Если вы передаете скаляр, может быть крошечное снижение производительности при наличии &$val и прохождении указателя.
  • Если вы передаете структуру и вам не нужно писать в нее, вероятно, нулевая разница.
  • Если вы передаете структуру и do необходимо написать в нее, тогда вы должны были решить, как передать ее, исходя из того, хотите ли вы сохранить изменения, не по производительности.
0 голосов
/ 12 ноября 2018

Разработчики языка просто пытаются справиться с ситуацией, когда элементы массива имеют размер большой, , и непосредственно уточнить в исходном коде, что именно должно произойти.Теперь вы можете сообщить PHP, что переменная $val должна содержать ссылку на элемент массива, что означает, что большое значение не будет продублировано и сборщик мусора в памяти победит 'У нас больше работы, , и исходный код ясно говорит об этом. Последующие программисты, читающие это утверждение, будут точно знать, что собирается делать PHP.

Конечно, ссылки естественныболее эффективно, чем копирование значений в памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...