PHP 中哪个更快:!!或(布尔)?

Fab*_*zio -2 php boolean micro-optimization

我正在尝试对代码进行微优化,我想知道将变量转换为布尔值哪个更快:

<?php
$a='test';
$result1 = !!$a;
$result2 = (bool)$a;
?>
Run Code Online (Sandbox Code Playgroud)

我不担心代码大小,只担心执行时间。

这里有一些基准,但它非常不确定(尝试了多次),所以我想知道 PHP 的源代码中会发生什么,看看它们是否有不同的处理方式:

<?php
$a = 'test';
for($c=0;$c<3;$c++){
    $start = microtime(true);
    for($i=0;$i<10000000;$i++){
        $result = !!$a;
    }
    $end =  microtime(true);
    $delta = $end-$start;
    echo '!!: '.$delta.'<br />';
}
$a = 'test';
for($c=0;$c<3;$c++){
    $start = microtime(true);
    for($i=0;$i<10000000;$i++){
        $result = (bool)$a;
    }
    $end =  microtime(true);
    $delta = $end-$start;
    echo '(bool): '.$delta.'<br />';
}
Run Code Online (Sandbox Code Playgroud)

结果

!!: 0.349671030045
!!: 0.362552021027
!!: 0.351779937744
(bool): 0.346690893173
(bool): 0.36114192009
(bool): 0.373970985413
Run Code Online (Sandbox Code Playgroud)

laf*_*for 5

(bool)$a意思是:将$a其转换为布尔值。

!!$a意思是: take $a,如果它还不是布尔值,则将其转换为布尔值,然后获取结果值并翻转它,然后再次翻转它。

不仅(bool)执行速度更快(是的,我已经对它进行了基准测试;不,除非您有数百万个这样的操作,否则您不会注意到任何差异),而且读取速度也更快。如果需要强制类型转换,则强制类型转换即可;不要使用一些“聪明”的黑客行为,这会让那些必须阅读你的代码的人感到困惑。