在PHP中,什么是更快,更大的Switch语句或Array键查找

时间:2011-07-27 23:57:27

标签: php arrays parsing hash switch-statement

在PHP中,什么更快,制作大型switch语句,或设置数组并查找密钥?

现在,在你回答之前,我很清楚,对于纯查找,数组更快。但是,这是假设只创建一次数组,然后重复查找。

但这不是我正在做的 - 每次运行代码都是新的,每次只使用一次数组。因此,每次都需要重新计算所有数组哈希,并且我想知道这样的设置是否比简单地使用switch语句慢。

2 个答案:

答案 0 :(得分:13)

做了一些测试:

array_gen.php:

<?
echo '<?
$a = 432;
$hash = array(
';
for($i = 0; $i < 10000; $i++) echo "$i => $i,\n";
echo ');
echo $hash[$a];
';

switch_gen.php:

<?
echo '<?
$a = 432;
switch($a) {
';
for($i = 0; $i < 10000; $i++) echo "case $i: echo $i; break;\n";
echo '}';

然后:

php array_gen.php > array_.php
php switch_gen.php > switch.php

time tcsh -c 'repeat 1000 php array.php > /dev/null'
19.297u 4.791s 0:25.16 95.7%
time tcsh -c 'repeat 1000 php switch.php > /dev/null'
25.081u 5.543s 0:31.66 96.7%

然后我将循环修改为:

for($i = 'a'; $i < 'z'; $i++)
  for($j = 'a'; $j < 'z'; $j++)
    for($k = 'a'; $k < 'z'; $k++)

创建17576个3个字母组合。

time tcsh -c 'repeat 1000 php array.php > /dev/null'
30.916u 5.831s 0:37.85 97.0%
time tcsh -c 'repeat 1000 php switch.php > /dev/null'
36.257u 6.624s 0:43.96 97.5%

即使包含设置时间,数组方法也会每次都获胜。但不是很多。所以我想我会忽略这种优化,并且更容易做到。

答案 1 :(得分:4)

它取决于数组大小,但是对于大多数实际用途,您可以认为数组更快。原因很简单; switch语句必须按顺序与switch语句中的每个条目进行比较,但是数组方法只需获取哈希并找到该条目。当您的交换机中的条目数量很少以至于顺序比较比散列更快时,使用交换机会更快,但阵列方法会更快地变得更有效。在计算机科学术语中,它是O(n)与O(1)的问题。