我想知道哪个更好:
$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代码更快地处理查找,但是首先构建数组肯定会花费很多时间。
答案 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)
您可以测试查看值是否也不存在需要多长时间。我的猜测是数组键查找会更快。如果你必须查询它两次或更多,缓存数组应该使它更快。
但速度并不是最重要的事情。数组键在长期内更好,您想要添加和删除数据。您还可以在将来从其他来源获取数据。
答案 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