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

Ari*_*iel 25 php arrays hash parsing switch-statement

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

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

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

Ari*_*iel 13

做了一些测试:

array_gen.php:

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

switch_gen.php:

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

然后:

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%
Run Code Online (Sandbox Code Playgroud)

然后我将循环修改为:

for($i = 'a'; $i < 'z'; $i++)
  for($j = 'a'; $j < 'z'; $j++)
    for($k = 'a'; $k < 'z'; $k++)
Run Code Online (Sandbox Code Playgroud)

创建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%
Run Code Online (Sandbox Code Playgroud)

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

  • 10,000次迭代的6秒差异.因此,一次迭代的增益为0.0006.使用更容易编程的东西.顺便说一下,这几乎总是正确的事情,因为更好的硬件几乎总是比你花费超级优化的东西便宜(这通常会让代码不那么可读= =更少可维护性==更多工作到改变它==甚至更多的优化成本). (6认同)
  • @阿里尔,-1。哪个 PHP 引擎(版本)?哪个操作系统?如果您想做测试,请**精心**。半心半意的测试结果是**有害**。他们不能被信任,他们的结论应该谨慎对待。这个问题仍然悬而未决。 (2认同)

Pau*_*ier 6

它的大小取决于数组的大小,但是出于大多数实际目的,您可以考虑使用数组更快。原因很简单;switch语句必须与switch语句中的每个条目进行顺序比较,但是数组方法只是获取哈希并找到该条目。当开关中的条目太少而顺序比较比哈希运算要快时,使用开关的速度会更快,但是数组方法会变得更加高效。用计算机科学的术语来说,这是O(n)与O(1)的问题。

  • 我的问题也是关于数组创建的速度,因为数组仅使用了一次。 (3认同)
  • @PaulSonier,为什么switch语句需要顺序比较?Zend引擎的实现现在可能正在做这种事情,但是并没有这种理论上的限制,将来很可能它们不会按顺序进行比较。 (2认同)