【发布时间】:2011-10-20 19:39:24
【问题描述】:
我遇到了这段代码...
if(isset($string[255])) {
// too long
}
isset() 比
快 6 到 40 倍if(strlen($string) > 255) {
// too long
}
isset() 的唯一缺点是代码不清楚 - 我们无法立即知道正在做什么(请参阅 pekka 的回答)。我们可以将 isset() 包装在一个函数中,即 strlt($string,255),但这样我们就失去了 isset() 的速度优势。
如何在保持代码可读性的同时使用更快的 isset() 函数?
编辑:测试以显示速度http://codepad.org/ztYF0bE3
strlen() over 1000000 iterations 7.5193998813629
isset() over 1000000 iterations 0.29940009117126
EDIT2:这就是 isset() 更快的原因
$string = 'abcdefg';
var_dump($string[2]);
Output: string(1) “c”
$string = 'abcdefg';
if (isset($string[7])){
echo $string[7].' found!';
}else{
echo 'No character found at position 7!';
}
这比使用 strlen() 更快,因为“……调用函数比使用语言结构更昂贵。” http://www.phpreferencebook.com/tips/use-isset-instead-of-strlen/
EDIT3:我总是被教导要对微优化感兴趣。可能是因为我是在计算机资源很少的时候受教的。我对它可能并不重要的想法持开放态度,答案中有一些很好的论据反对它。 我已经开始了一个新问题来探索这个......https://stackoverflow.com/questions/6983208/is-micro-optimisation-important-when-coding
【问题讨论】:
-
我认为第二个更快,因为 PHP 内部会跟踪字符串的长度。
-
嗯,字符串是如何在 PHP 中实现的 - 以空结尾或以长度为前缀?那会有很大的不同。
-
codepad.org/IGKfD2Mk 我复制/粘贴了您的代码,但结果完全不同:D
-
@yokoloko 奇怪,想知道为什么?有趣 - isset() 仍然更快。
-
@Kerrek SB:两者都没有,它们在结构中使用 char* 和单独的长度值进行跟踪。请参阅 svn.php.net/viewvc/php/php-src/trunk/Zend/… ,查找 _zvalue_value 结构。因此,在这个问题的上下文中, strlen() 是 O(1) 并且 isset() 'trick' 不仅没有必要,而且速度更慢,意图也不太清楚。
标签: php coding-style