使用in_array - array()或包含数组的变量作为目标的速度更快/效率更高?

时间:2014-09-30 17:03:26

标签: php arrays

简而言之,哪个更有效,更好还是更快?

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

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

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

如果数组在变量中,或者在循环中每次运行in_array时是否重新声明它是否真的重要?

2 个答案:

答案 0 :(得分:1)

第一种方式更快,但不够清晰。但是,您需要以这种方式评估的大多数数组将是您已为其他目的分配给变量的数组。后一种方法需要额外的分配,因此需要更多的内存和时间。

如果您关心事物的速度有多快(这绝对是一种接近编程的好方法),您应该创建或适当的时间跟踪类。几乎所有我创造的新方法,我测试它的速度,并将其与现有方法进行比较,以确保它有益/高效,并且我正在走上正确的轨道。创建一个时间类并执行您想要比较10000多次迭代的每个场景,具体取决于您的测试,以查看哪个更快。这样你就不必猜测或得到别人对此事的见解。

编辑: 这可能不需要说,但我认为我应该添加它以防万一: php中的任何时间类都需要跟踪毫秒相关的能力。

答案 1 :(得分:1)

说到速度 - 如果可能的话,我更喜欢使用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函数具有高速度。