将括号留在PHP if else结构中会提高速度吗?

时间:2013-12-09 07:00:40

标签: php performance

我正在编写一种算法,其中几毫秒的差异很重要。我想知道以下第一个语句是否比下面的第二个语句更快,更等或更慢:

第一句话:

if( true )
{
    return true;
}

第二声明:

if( true )
    return true;

有人可能也知道有关提高速度的课程吗?

3 个答案:

答案 0 :(得分:6)

TL; DR 没有括号可能更快,每个周期的纳秒级数最多,但在不引入错误和复杂性方面是一个糟糕的主意在路上。


作为一个很好的参考,请看一下http://www.phpbench.com/。当且仅当您已经实施并经过测试时,如果您担心这类调整可能会在纳秒内节省下来。

在着迷这类事情之前,你应该认真考虑实施OpCacheOpCache将预编译的字节码存储在内存中。仅当编译器尚未在OpCache上下文中对其进行优化时,括号或无括号调整才有意义。

另外,正如@Abhineet所说,如果省略括号,你将非常快速地使你的代码难以理解。

只是因为:这是一个答案。我的基准代码:

// Counting to 10,000,000, without brackets
$i=0;
$start = microtime(true);
while($i < 10000000) {
    if(true)
        $i++;
}
echo "<br>".( (int)((microtime(true) - $start)*1000) )." ms<br/>";

// Counting to 10,000,000, with brackets
$i=0;
$start = microtime(true);
while($i < 10000000) {
    if(true) {
        $i++;
    }
}
echo "<br>".( (int)((microtime(true) - $start)*1000) )." ms<br/>";

在我的戴尔笔记本电脑上,运行Windows 7,Apache / 2.2.21和PHP / 5.3.9,无括号版本耗时2081毫秒,括号内版本耗时2765毫秒。为了验证,我运行了几次,每次都得到非常接近这些数字的结果。我也改变了测试的顺序,得到了可比较的结果。但是当我在运行PHP 5.3.3的另一个系统上运行它时,反之亦然 - 括号一直更快。如果您非常关心这一点,那么您将不得不在特定的计算机,PHP版本以及您打算在生产中使用的配置上广泛地对代码进行基准测试。

所以,最重要的是,你可能 1000万次迭代 可以节省大约0.7秒。做你想做的......

更新的基准

我再次偶然发现了这个答案,并看到(1)它已经3.5岁了,(2)我的基准测试是在PHP 5.3(!)中。所以,我决定更新它们。在PHP 7+中,这种微优化更加毫无意义。几个基准:

在PHP 7.0.0中,差异小于4%,对于没有括号的1000万次迭代,数字大约为355 ms,而使用括号则为368 ms。这是每1000万次迭代的0.013秒的差异。

在PHP 7.1.5中,它更荒谬。对于 1亿次迭代,我得到了1326 ms的数字,而1331 ms。缓存预热后,差异通常小于2毫秒,通常为0毫秒。换句话说,在当前版本的PHP中,省略括号最多可以为每个if语句节省大约0.00000000002 s。在我看来,这远远不足以证明引入错误和使代码更难阅读的风险。

答案 1 :(得分:4)

你应该总是使用括号。没有更好的方法让你的代码混淆和难以阅读,而不是从括号中删除。据我所知,这两种方式都没有显着的性能影响。

这两个额外的密钥对于阅读代码的人来说意味着一个与众不同的世界。

Ex ::对于此代码,

if( true )
    return true;
echo "Hello World!";

如果你这样做会怎样,

if( true )
   // return true;
echo "Hello World!";

看,它有时可以证明是致命的。

答案 2 :(得分:0)

快速回答:使用PSR-2

这个对我来说很有意思,因为不使用它们会更快,而且这里的程序员几乎一致同意&#34;总是使用它们#34;。但是,当对条纹或正则表达式进行烦恼时,他们会推迟加速...两者都有名义上的收益充其量,因此除非得到保证,否则不应被视为优先考虑。

另一种看法: 我建议您采用PSR2并严格遵守这些规则(需要它们)。