使用in_array-array()或包含数组的变量作为目标,什么更快/更高效


What is faster/more efficient as target using in_array - array() or a variable with the array in it?

简而言之,哪个比另一个更高效、更好或更快?

if (in_array($value, array('val1', 'val2', 'val3'))  { ... }

$arr = array('val1', 'val2', 'val3');
if (in_array($value, $arr) { ... }

此代码将在循环中运行,因此相同的array(...)声明将多次发生。

数组是在一个变量中,还是在循环中每次运行in_array时都会动态重新声明,这真的重要吗?

说到速度,如果可能的话,我更喜欢使用isset($arr[$key])而不是in_array作为关联数组的键。

$arraySize = 10000;
$loop = 10000;
// for numbers, at first
$array = range(1, $arraySize);
$start = getMtime();
for($i = 0; $i < $loop; $i++)
{
    if (in_array(rand(1, $arraySize), $array))
       continue;
}
$end = getMtime();
echo ($end - $start) . '<br>';
$start = getMtime();
for($i = 0; $i < $loop; $i++)
{
    if (isset($array[rand(1, $arraySize)]))
       continue;
}
$end = getMtime();
echo ($end - $start) . '<br>';
// the same, but for strings
foreach($array as &$el)
   $el = generateId(10);
$start = getMtime();
for($i = 0; $i < $loop; $i++)
{
    if (in_array(generateId(10), $array))
       continue;
}
$end = getMtime();
echo ($end - $start) . '<br>';
// now set them as keys
$array = array_flip($array);
echo 'Size of array ' . count($array) . '<br>';
$start = getMtime();
for($i = 0; $i < $loop; $i++)
{
    if (isset($array[generateId(10)]))
       continue;
}
$end = getMtime();
echo $end - $start;

function getMtime()
{
   $mtime = microtime(); 
   $mtime = explode(" ",$mtime); 
   $mtime = $mtime[1] + $mtime[0]; 
   return $mtime;
}  
function generateId($len = 10)
{
   return join('', array_map(function() { return substr('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', rand(0, 61), 1); }, range(1, $len)));
}

结果:

0.69922399520874  // in_array, numbers
0.0039558410644531 // isset, numbers
3.5183579921722 // in_array, strings
Size of array 10000
0.15712094306946  // isset, strings

没有重复的键,所以翻转数组的大小是相同的。当然,可能是我遗漏了一些东西,但我不希望in_array函数的速度很快。

第一种方法更快,但不那么清晰。然而,大多数需要以这种方式计算的数组都将是您已经为其他目的分配给变量的数组。后一种方法需要一个额外的赋值,因此它将占用更多的内存和时间。

如果你关心事情有多快,你应该创建或适当地创建一个时间跟踪类(这绝对是一个很好的编程方法)。几乎每一种我创造的新方法,我都会测试它的速度,并将其与现有方法进行比较,以确保它是有益的/有效的,并且我走在正确的轨道上。创建一个时间类并执行每个场景,根据您的测试,比较10000多次迭代,看看哪个更快。这样,你就永远不必猜测或了解别人对此事的看法。

编辑:这可能不需要说,但我想我应该补充一下,以防万一:php中的任何时间类都需要跟踪毫秒的能力才能具有相关性。