У меня вопрос, что быстрее...
- Я делаю много переменных, содержащих все мои данные, или
- Я делаю один массив в одной переменной, которая содержит все мои данные и доступ к ней.
У меня вопрос, что быстрее...
Просто попробуйте:)
С 5 переменными
$myvar1 = 'hello';
$myvar2 = 'hello';
$myvar3 = 'hello';
$myvar4 = 'hello';
$myvar4 = 'hello';
print_r(memory_get_usage());
Resut: 618600
с 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 секунды
Также 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
Таким образом, массивы используют немного меньше памяти.
Люди здесь говорят, что массивы быстрее. Но массивы также являются переменными. если вы используете массив - вам все равно нужно получить к нему доступ, как и любую переменную, и, кроме того, вам нужно получить доступ к элементу массива. Итак, мне кажется, что массив, используемый как хранилище для переменных, не самая лучшая идея.
Дополнительно - массивы используются для хранения данных массива. Например, например категории 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 поможет вам написать эти имена, такой код легче читать и поддерживать. И это более важно, как и для меня.
Даже если они чем-то медленнее или занимают больше памяти - это не самая худшая проблема с точки зрения скорости/использования памяти.
Сохранение всех ваших данных в одном массиве может быть быстрее, в зависимости от того, как вы обрабатываете свои данные. Я бы рекомендовал группировать каждую группу данных, которая имеет близкое отношение к eachother в массиве.
Надеюсь, что это поможет.
Многие переменные быстрее, чем массив, потому что массив - это упорядоченная карта (http://php.net/manual/en/language.types.array.php), и поэтому по определению для каждого значение в массиве, также присваивается ссылочный ключ к значению в массиве. Это требует дополнительной памяти и может иметь значительное влияние, если говорить о сотнях тысяч записей в массиве. Производительность уменьшается по мере увеличения количества записей. Этих издержек можно избежать с помощью скалярных переменных вместо массивов.
Недавно я работал над профилировщиком для измерения памяти и времени выполнения с использованием обратного вызова tick. Сначала я использовал массив для регистрации событий и отслеживания всех измерений на каждом интервале тика. Поместив эти значения в отдельные скалярные переменные вместо массива, я обнаружил, что производительность значительно увеличилась (между 10-20% и 100000 - 1000000 записей соответственно).
Однако, когда массив имеет только несколько записей, разница со скалярными переменными нигиль, и производительность не должна быть проблемой. В таких случаях массивы могут лучше подойти к ситуации и быть более эффективными, улучшать читаемость, обслуживание и т.д.
сделать все относительные данные в массиве, массивы выполняются быстрее.