我正在尝试优化PHP应用程序中的特定函数,并愚蠢地假设'if'语句中的布尔查找比字符串比较更快。但是为了检查它,我使用microtime进行了一个简短的测试(见下文)。令我惊讶的是,字符串查找更快。
我的测试是否有任何问题(我连接过多的咖啡,所以我对自己的代码持怀疑态度)?如果没有,我会对PHP中有关字符串与布尔查找的任何评论感兴趣。
第一次测试(布尔查找)的结果为0.168秒。
第二次测试(字符串查找)的结果是0.005秒。
<?php
$how_many = 1000000;
$counter1 = 0;
$counter2 = 0;
$abc = array('boolean_lookup'=>TRUE, 'string_lookup'=>'something_else');
$start = microtime();
for ($i = 0; $i < $how_many; $i++)
{
if ($abc['boolean_lookup'])
{
$counter1++;
}
}
echo ($start - microtime());
echo '<hr>';
$start = microtime();
for ($i = 0; $i < $how_many; $i++)
{
if ($abc['string_lookup'] == 'something_else')
{
$counter2++;
}
}
echo ($start - microtime());
答案 0 :(得分:6)
是的,你喝的咖啡太多了。您需要使用microtime(true)
,否则您的日期计算工作时间为毫秒,但完全忽略秒数。此外,使用当前时间 - 开始时间来衡量持续时间,而不是开始时间 - 当前时间,否则你得到一个负面的时间。请尝试使用以下代码:
<?php
$how_many = 5000000;
$counter1 = 0;
$counter2 = 0;
$abc = array('boolean_lookup'=>TRUE, 'string_lookup'=>'something_else');
$start = microtime(true);
for($i = 0; $i < $how_many; $i++)
{
if($abc['boolean_lookup'])
{
$counter1++;
}
}
echo "FIRST: ", (microtime(true) - $start), "\n";
$start = microtime(true);
for($i = 0; $i < $how_many; $i++)
{
if($abc['string_lookup'] == 'something_else')
{
$counter2++;
}
}
echo "SECOND: ", (microtime(true) - $start), "\n";
答案 1 :(得分:0)
你可能想稍微调整一下布尔比较。
做一般if($ var)不是bool比较(与“字符串比较”相比)。
使用if($abc['boolean_lookup'] == TRUE)
或if($abc['boolean_lookup'] === TRUE)
(2对3等号)再次尝试测试。
我做了一个测试,包括bool比较,以及三等分符号比较。 另外还有一个循环来做3次,因为结果可能因许多外部因素而异。
由于脚本执行的总时间相当长,所以我低估了$how_many = 5000000;
到$how_many = 3000000;
这是最终的脚本:
<?php
function DoTest(){
$how_many = 3000000;
$counter1 = 0;
$counter2 = 0;
$counter3 = 0;
$counter4 = 0;
$counter5 = 0;
$counter6 = 0;
$abc = array('boolean_lookup'=>TRUE, 'string_lookup'=>'something_else');
$start = microtime(true);
for($i = 0; $i < $how_many; $i++){
if($abc['boolean_lookup']){
$counter1++;
}
}
echo "GENERAL-IF ON A BOOL: ", (microtime(true) - $start)*10, "<br />\n";
$start = microtime(true);
for($i = 0; $i < $how_many; $i++){
if($abc['string_lookup']){
$counter2++;
}
}
echo "GENERAL-IF ON A STRING: ", (microtime(true) - $start)*10, "<br />\n";
$start = microtime(true);
for($i = 0; $i < $how_many; $i++){
if($abc['boolean_lookup'] == TRUE){
$counter3++;
}
}
echo "TWO-EQUALL-IF ON A BOOL : ", (microtime(true) - $start)*10, "<br />\n";
$start = microtime(true);
for($i = 0; $i < $how_many; $i++){
if($abc['string_lookup'] == 'something_else'){
$counter4++;
}
}
echo "TWO-EQUALL-IF ON A STRING : ", (microtime(true) - $start)*10, "<br />\n";
$start = microtime(true);
for($i = 0; $i < $how_many; $i++){
if($abc['boolean_lookup'] === TRUE){
$counter5++;
}
}
echo "THREE-EQUALL-IF ON A BOOL : ", (microtime(true) - $start)*10, "<br />\n";
$start = microtime(true);
for($i = 0; $i < $how_many; $i++){
if($abc['string_lookup'] === 'something_else'){
$counter6++;
}
}
echo "THREE-EQUALL-IF ON A STRING : ", (microtime(true) - $start)*10, "<br />\n";
}
$number_of_tests = 3;
for($i = 0; $i < $number_of_tests; $i++){
echo "<br />\n<br />\n== Test #".($i+1)."<br />\n";
DoTest();
}
?>
结果:
== Test #1
GENERAL-IF ON A BOOL: 7.61245965958
GENERAL-IF ON A STRING: 7.49043941498
TWO-EQUALL-IF ON A BOOL : 8.92991065979
TWO-EQUALL-IF ON A STRING : 10.3996396065
THREE-EQUALL-IF ON A BOOL : 8.02039146423
THREE-EQUALL-IF ON A STRING : 9.25590991974
== Test #2
GENERAL-IF ON A BOOL: 7.74684906006
GENERAL-IF ON A STRING: 7.58201122284
TWO-EQUALL-IF ON A BOOL : 8.90240907669
TWO-EQUALL-IF ON A STRING : 10.2967596054
THREE-EQUALL-IF ON A BOOL : 8.08442115784
THREE-EQUALL-IF ON A STRING : 9.2577290535
== Test #3
GENERAL-IF ON A BOOL: 7.63362884521
GENERAL-IF ON A STRING: 7.5103187561
TWO-EQUALL-IF ON A BOOL : 8.92127037048
TWO-EQUALL-IF ON A STRING : 10.4210495949
THREE-EQUALL-IF ON A BOOL : 8.02319049835
THREE-EQUALL-IF ON A STRING : 9.25379991531
所以,我的结论是,在进行比较时(等号),毫无疑问,布尔是胜利者。
然而,当做一个简单的普通if if() - 语句时,字符串先返回bool。
有一天,我可能会检查返回true或false是否存在差异(即检测相反的情况需要更长的时间吗?)
问候, Krinkle