PHP - много переменных или один массив? - программирование
Подтвердить что ты не робот

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

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

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

Ответ 1

Просто попробуйте:)

Тест 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

Ответ 2

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

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

Тест массива

$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 секунды

Также node, что использование массивов со строкой в ​​качестве индекса будет намного медленнее (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

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

Ответ 3

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

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

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

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

Как только у вас есть разные типы данных (говоря о значении этих данных, а не о типе типа 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 поможет вам написать эти имена, такой код легче читать и поддерживать. И это более важно, как и для меня.

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

Ответ 4

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

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

Ответ 5

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

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

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

Ответ 6

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