Это плохо для производительности, чтобы извлечь переменные из массива? - PullRequest
2 голосов
/ 19 мая 2010

Я узнал о замечательной функции extract в PHP и думаю, что она действительно удобна. Однако я узнал, что большинство хороших вещей в PHP также влияет на производительность, поэтому мой вопрос в том, что влияет на использование extract, если смотреть с точки зрения производительности?

Разве нельзя использовать большие приложения для извлечения переменных из массивов?

Ответы [ 5 ]

2 голосов
/ 19 мая 2010

Обновление

Как отметил ниже комментатор и, как я сейчас хорошо знаю, годы спустя - переменные php являются копируемыми при записи. Извлечение в глобальную область действия будет , однако не позволит переменным быть собранными. Итак, как я уже говорил, «рассмотрите вашу сферу»


Зависит от размера массива и области, в которой вы его извлекаете, скажем, вы извлекаете огромный массив в глобальное пространство имен, я могу видеть, что это дает эффект, так как все эти данные будут в памяти дважды - поверьте, хотя это может сделать некоторые забавные внутренние вещи, которые, как известно, PHP делает, чтобы ограничить это -

но скажи, что сделал

function bob(){
    extract( array( 'a' => 'woo', 'b' =>'fun', 'c' => 'array' ) );
}

это не будет иметь никакого реального длительного эффекта.

Короче говоря, просто подумайте, что вы делаете, зачем вы это делаете, и объем.

2 голосов
/ 19 мая 2010

Я не понимаю, почему это должно быть таким большим ударом по производительности, если вы не извлекаете огромные массивы в большие циклы. Но я так и не нашел причины использовать extract:)

2 голосов
/ 19 мая 2010

extract не следует использовать для ненадежных данных. И это обычно не полезно для доверенных данных (потому что, вероятно, существует ограниченное количество известных ключей массива).

0 голосов
/ 21 августа 2013

Мне однажды пришлось отлаживать скрипт, который вылетал; получается, что PHP не хватает памяти.

Часть проблемы заключалась в том, что extract() использовался в цикле из 25000 элементов. Это будет только пройти около 2300 элементов, прежде чем закончится память. Я заменил экстракт (ассоциативный массив из 4 элементов) вручную установив переменные, и цикл смог обработать около 5200 записей.

Так что extract() определенно имеет недостатки в производительности.

0 голосов
/ 19 мая 2010

Работа с массивами в большинстве языков намного лучше, потому что компилятор и / или интерпретатор могут использовать с ним SIMD инструкции.

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

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