PHP - 许多变量或一个数组?

时间:2013-01-15 12:24:19

标签: php arrays variables

我有一个问题,更快的是什么......

  1. 我制作了许多包含我所有数据的变量
  2. 我在一个包含所有数据的变量中创建一个数组并访问它

6 个答案:

答案 0 :(得分:20)

试一试:)

测试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

答案 1 :(得分:20)

简短:访问变量的速度更快。

但是你可能因为更好code quality而使用数组。要获得更好的性能,请使用缓存。无论如何,当它们发生时,你应该只处理 的性能问题!

阵列测试

$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_findzend_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

因此数组使用的内存略少。

答案 2 :(得分:4)

这里的人说阵列更快。但阵列也是变量。如果你使用数组 - 你仍然需要像任何变量一样访问它,另外你需要访问数组中的项目。因此,在我看来,像变量存储一样使用的数组并不是最好的主意。

此外 - 数组用于存储一些数组数据。喜欢类别id =&gt;例如,类别名称对。

$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都可以帮助您编写这些名称,这样的代码更易于阅读和支持。这对我来说更重要。

即使它们以某种方式变慢,或者占用更多内存 - 这在速度/内存使用方面肯定不是最糟糕的问题。

答案 3 :(得分:1)

将所有数据存储在一个阵列中可能会更快,具体取决于您处理数据的方式。我建议将每组与数据中彼此关系密切的数据分组。

希望这有帮助。

答案 4 :(得分:1)

许多变量比数组更快,主要是因为数组是有序映射(http://php.net/manual/en/language.types.array.php),因此根据数组中每个值的定义,还会分配数组中值的引用键。 这会花费额外的内存,并且在说出阵列中数十万条记录时会产生重大影响。 随着记录数量的增加,性能会下降。 使用标量变量而不是数组可以避免这种开销。

最近我正在研究一个分析器,使用tick回调来测量内存和执行时间。 起初,我使用一个数组来记录事件并跟踪每个滴答间隔的所有测量值。 将这些值放在单独的标量变量而不是数组中之后,我发现性能显着提高(分别为10 - 20%,100000 - 1000000条记录)。

但是,当一个数组只有少量记录时,与标量变量的区别在于nihil并且性能不应该成为问题。 在这种情况下,阵列可能更适合这种情况,更有效,提高可读性,维护等。

答案 5 :(得分:0)

在数组中生成所有相关数据,数组更快。