PHP – много переменных или один массив?

У меня вопрос, что быстрее …

  1. Я делаю много переменных, которые содержат все мои данные, или
  2. Я делаю один массив в одной переменной, которая содержит все мои данные и доступ к ней

Просто попробуй 🙂

Тест 1

С 5 переменными

$myvar1 = 'hello'; $myvar2 = 'hello'; $myvar3 = 'hello'; $myvar4 = 'hello'; $myvar4 = 'hello'; print_r(memory_get_usage()); 

Resut: 618600

Тест 2

с 5 ключами массива

 $myvar = array(); $myvar['var1'] = 'hello'; $myvar['var2'] = 'hello'; $myvar['var3'] = 'hello'; $myvar['var4'] = 'hello'; $myvar['var5'] = 'hello'; print_r(memory_get_usage()); 

Resut: 620256

Короткие: доступ к переменной выполняется быстрее.

Но все же вы можете использовать массивы из-за лучшего качества кода . Для повышения производительности используйте кеширование. В любом случае вы должны решать проблемы производительности только тогда, когда они происходят!

Тест массива

 $n = 1000000; $startTime = microtime(true); for ($i = 0; $i <= $n; $i++) { $x = $a[1]; } $endTime = microtime(true); $elapsed = $endTime - $startTime; echo "Array: $elapsed seconds"; 

Переменный тест

 $startTime = microtime(true); for ($i = 0; $i <= $n; $i++) { $x = $v; } $endTime = microtime(true); $elapsed = $endTime - $startTime; echo "Variable : $elapsed seconds"; 

Результаты

Массив: 0,092 секунды

Переменная: 0,064 секунды

Также узел, который использует массивы со строкой в ​​качестве индекса, будет намного медленнее (hashmap). Сравните zend_hash_find vs zend_hash_index_find .

Насколько велик массив, на самом деле не имеет значения, если я использую $a = array_fill( 0, 1000, 1 ); и $x = $a2[999];

Память

Не спрашивайте, но и интересным является использование памяти. Поэтому я создал массив с 10000 элементами и 10000 переменных.

 $a = array(); for ($i = 0; $i <= 10000; $i++) { // one array eval('$a[] = "test";'); // 3454128 // Variables //eval('$a' . $i. ' = "test";'); // 3552360 } print_r(memory_get_usage()); 

Массив: 3454128

Переменные: 3552360

Таким образом, массивы используют немного меньше памяти.

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

Дополнительно – массивы используются для хранения данных массива. Например, например категории id => пары имен категорий.

 $catId1 = "Category 1"; $catId2 = "Category 2"; $catId3 = "Category 3"; 

Код, подобный выше, был бы … странным. Вы теряете многие функции массива, например, не можете проходить через все категории в цикле. Итак, для массива данных – массив – это то, что вам нужно.

Когда у вас есть разные типы данных (говоря о значении этих данных, а не о типе типа integer или string), вам лучше использовать переменные:

 $requested_category = 1; $requested_category_name = "Some category"; $category_processing_result = "Ok"; 

вместо массива:

 $varsArray['requested_category'] = 1; $varsArray['requested_category_name'] = "Some category"; $varsArray['category_processing_result'] = "Ok"; 

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

Даже если они чем-то медленнее или занимают больше памяти – это не худшая проблема с точки зрения скорости / использования памяти.

Хранение всех ваших данных в одном массиве может быть быстрее, в зависимости от того, как вы обрабатываете свои данные. Я бы рекомендовал группировать каждую группу данных, которая имеет близкое отношение к eachother в массиве.

Надеюсь это поможет.

Многие переменные быстрее, чем массив, потому что массив – упорядоченная карта ( http://php.net/manual/en/language.types.array.php ), и поэтому по определению для каждого значения в массиве также назначается ссылочный ключ к значению в массиве. Это требует дополнительной памяти и может иметь значительное влияние, если говорить о сотнях тысяч записей в массиве. Производительность уменьшается по мере увеличения количества записей. Этих издержек можно избежать, если вместо массивов использовать скалярные переменные.

Недавно я работал над профилировщиком для измерения памяти и времени выполнения с использованием обратного вызова tick. Сначала я использовал массив для регистрации событий и отслеживания всех измерений на каждом интервале тика. После ввода этих значений в отдельные скалярные переменные вместо массива я обнаружил, что производительность значительно увеличилась (между 10 и 20% при 100000 – 1000000 записей соответственно).

Однако, когда массив имеет только несколько записей, разница со скалярными переменными нигиль, и производительность не должна быть проблемой. В таких случаях массивы могут лучше подойти к ситуации и быть более эффективными, улучшать читаемость, обслуживание и т. Д.

сделать все относительные данные в массиве, массивы быстрее.