什么是更快的:in_array还是设置?[已关闭]

2022-08-30 07:29:57

这个问题只适合我,因为我总是喜欢编写优化的代码,这些代码也可以在廉价的慢速服务器(或具有大量流量的服务器)上运行。

我环顾四周,找不到答案。我想知道这两个例子之间有什么更快,请记住,在我的情况下,数组的键并不重要(自然是伪代码):

<?php
$a = array();
while($new_val = 'get over 100k email addresses already lowercased'){
    if(!in_array($new_val, $a){
        $a[] = $new_val;
        //do other stuff
    }
}
?>

<?php
$a = array();
while($new_val = 'get over 100k email addresses already lowercased'){
    if(!isset($a[$new_val]){
        $a[$new_val] = true;
        //do other stuff
    }
}
?>

由于问题的重点不是数组冲突,我想补充一点,如果您害怕冲突插入,则可以使用。它仍然可能导致冲突,但在读取用户提供的文件时会消除可能的DoS攻击(http://nikic.github.com/2011/12/28/Supercolliding-a-PHP-array.html$a[$new_value]$a[md5($new_value)])


答案 1

到目前为止,答案是正确的。在这种情况下使用速度更快,因为isset

  • 它对键使用 O(1) 哈希搜索,而必须检查每个值,直到找到匹配项。in_array
  • 作为操作码,它的开销比调用内置函数要少。in_array

这些可以通过使用具有值的数组(在下面的测试中为10,000)来证明,从而强制进行更多搜索。in_array

isset:    0.009623
in_array: 1.738441

这建立在Jason的基准测试之上,通过填充一些随机值并偶尔找到数组中存在的值。都是随机的,所以要小心,时间会波动。

$a = array();
for ($i = 0; $i < 10000; ++$i) {
    $v = rand(1, 1000000);
    $a[$v] = $v;
}
echo "Size: ", count($a), PHP_EOL;

$start = microtime( true );

for ($i = 0; $i < 10000; ++$i) {
    isset($a[rand(1, 1000000)]);
}

$total_time = microtime( true ) - $start;
echo "Total time: ", number_format($total_time, 6), PHP_EOL;

$start = microtime( true );

for ($i = 0; $i < 10000; ++$i) {
    in_array(rand(1, 1000000), $a);
}

$total_time = microtime( true ) - $start;
echo "Total time: ", number_format($total_time, 6), PHP_EOL;

答案 2

哪个更快:vsisset()in_array()

isset()更快。

虽然它应该是显而易见的,但只测试一个值。而 将循环访问整个数组,测试每个元素的值。isset()in_array()

使用microtime()进行粗略的基准测试非常容易。

结果:

Total time isset():    0.002857
Total time in_array(): 0.017103

注意:无论是否存在,结果都是相似的。

法典:

<?php
$a = array();
$start = microtime( true );

for ($i = 0; $i < 10000; ++$i) {
    isset($a['key']);
}

$total_time = microtime( true ) - $start;
echo "Total time: ", number_format($total_time, 6), PHP_EOL;

$start = microtime( true );

for ($i = 0; $i < 10000; ++$i) {
    in_array('key', $a);
}

$total_time = microtime( true ) - $start;
echo "Total time: ", number_format($total_time, 6), PHP_EOL;

exit;

其他资源

我鼓励你也看看:


推荐