我有一个问题,什么更快...
- 我制作了许多包含我所有数据的变量,或者
- 我在一个变量中创建一个数组,其中包含我的所有数据并访问它
只是尝试:)
有 5 个变量
$myvar1 = 'hello';
$myvar2 = 'hello';
$myvar3 = 'hello';
$myvar4 = 'hello';
$myvar4 = 'hello';
print_r(memory_get_usage());
结果:618600
带有 5 个数组键
$myvar = array();
$myvar['var1'] = 'hello';
$myvar['var2'] = 'hello';
$myvar['var3'] = 'hello';
$myvar['var4'] = 'hello';
$myvar['var5'] = 'hello';
print_r(memory_get_usage());
结果: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 秒
使用带有字符串作为索引的数组的节点也会慢得多(哈希图)。比较zend_hash_find与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
循环遍历所有类别。因此,对于数组数据 - 数组就是您所需要的。
一旦您拥有不同类型的数据(谈论该数据的含义,而不是整数或字符串之类的类型),您应该更好地使用变量:
$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 都可以帮助您编写这些名称,这样的代码更易于阅读和支持。这对我来说更重要。
即使它们以某种方式变慢,或者占用更多内存 - 就速度/内存使用而言,这肯定不是最糟糕的问题。
许多变量比数组快,主要是因为数组是有序映射(http://php.net/manual/en/language.types.array.php),因此根据数组中每个值的定义,a数组中的值的引用键也被分配。这会消耗额外的内存,并且在谈到数组中的数十万条记录时会产生重大影响。性能随着记录数量的增加而降低。这种开销可以通过使用标量变量而不是数组来避免。
最近,我正在开发一个分析器,以使用刻度回调来测量内存和执行时间。起初,我使用一个数组来记录事件并跟踪每个滴答间隔的所有测量值。将这些值放在单独的标量变量而不是数组中后,我发现性能显着提高(分别在 10 - 20% 之间,有 100000 - 1000000 条记录)。
但是,当一个数组只有几条记录时,与标量变量的区别是没有的,性能应该不是问题。在这种情况下,数组可能更适合这种情况并更有效,提高可读性、维护等。
将所有数据存储在一个数组中可能会更快,具体取决于您处理数据的方式。我建议将彼此密切相关的每组数据分组到一个数组中。
希望这可以帮助。
将所有相关数据放在一个数组中,数组更快。