什么更快,数组查找(包括数组构建)或IF堆栈?

时间:2008-12-05 15:09:50

标签: php

我想知道哪个更好:

$lookup = array( "a" => 1, "b" => 2, "c" => 3 );
return $lookup[$key];

if ( $key == "a" ) return 1
else if ( $key == "b" ) return 2
else if ( $key == "c" ) return 3

或者只是一个不错的开关...

switch($key){
case "a": return 1;
case "b": return 2;
case "c": return 3;
}

我总是喜欢第一种方法,因为我可以将数据与代码分开;在这个规模上,它看起来很傻,但规模更大,有数千行查找条目; PHP需要多长时间才能构建一个数组,然后每个请求只检查1或2个条目。

我认为它必须经过测试和计时,但我会说数组越大越复杂,它就越慢。

PHP应该能够比PHP代码更快地处理查找,但是首先构建数组肯定会花费很多时间。

8 个答案:

答案 0 :(得分:6)

对于具有可测量性能的任何内容(不仅仅是3个条目),查找是最快的方式。这就是哈希表的用途。

答案 1 :(得分:3)

首先,您可以自行测试它。

其次,更重要的是,哪个最适合您正在使用的代码?在任何情况下,您节省的时间都可以忽略不计。

答案 2 :(得分:2)

您将需要测试才能找到它。我的猜测是3件你最好用if / then / else。 This is a nice article关于比特计数比较计算比特数和使用查找。剧透:Lookups赢了!

答案 3 :(得分:1)

您是每次构建阵列,还是可以构建一次并缓存它?

如果你每次都在构建它,我看不出它会如何更快。构建数组本身应该花费更长的时间来链接if()s(向数组中添加一个项目将及时关闭到一个if(),但是当你可以退出if时,你必须添加每个项目()早)

如果您可以使用缓存阵列,那么我认为这将是明显的赢家。

答案 4 :(得分:1)

所以我使用这个示例进行了一些测试,得到了以下结果:

emptyfunction:  0.00000087601416110992430969503855231472755349386716
lookuparray:    0.00000136602194309234629100648257538086483009465155
makearrayonly:  0.00000156002373695373539708814922266633118397294311
makearray:      0.00000174602739810943597796187489595842734502184612
ifblock:        0.00000127001986503601083772739543942265072473674081
switchblock:    0.00000131001937389373773757957151314679222764425504

每个都在一个方法中,所以我还包括一个空方法的时间。他们每人跑了1,000,000次然后平均。

只是进行查找(没有构建数组)实际上比if块慢(使用与我的代码相同的全局查找)并且只比开关块慢一点。

我不能把这个扩展到数百个if语句,但它只是表明if语句在这个级别上对单个查找更快。

答案 5 :(得分:0)

如果您有数千个条目,则阵列查找将获胜。关联数组可能有点慢,但找到一个数组键比执行数千个if()块要快得多(更不用说将它全部输出所需的时间!)

答案 6 :(得分:0)

您可以测试查看值是否也不存在需要多长时间。我的猜测是数组键查找会更快。如果你必须查询它两次或更多,缓存数组应该使它更快。

但速度并不是最重要的事情。数组键在长期内更好,您想要添加和删除数据。您还可以在将来从其他来源获取数据。

  • 如果您只是想查找一个值 你使用数组。
  • 如果你想采取行动那么 if和switch都有它们的用途。

答案 7 :(得分:0)

这是对阵列操作的一点测试

{
    $x = 0;
    foreach ($test as $k => $v) {
        $x = sprintf(” % s=>%sn”,$k,$v);}
}
{
    $x = 0;
    reset($test);
    while (list($k, $v) = each($test)) {
        $x = sprintf(” % s=>%sn”,$k,$v);
     }
}
{
    $x = 0;
    $k = array_keys($test);
    $co = sizeof($k);
    for ($it = 0; $it < $co; $it++) {
        $x = sprintf(” % s=>%sn”,$k[$it],$test[$k[$it]]);
     }
}
{
    $x = 0;
    reset($test);
    while ($k = key($test)) {
        $x = sprintf(” % s=>%sn”,$k,current($test)); next($test);
     }
}
  

访问时间(毫秒)
  8.1222
  10.3221
  9.7921
  8.9711